2016-03-29 7 views
0

Этот код работает:Есть ли более чистый, более короткий, встроенный способ обертывания элементов в истребителе в рубине?

permission.class.ancestors.include?(Enumerable) ? permission : [permission] 

Содержание в permission может либо символ или любой последовательности (скажем, массив). Если один элемент передан, он завернут в массив.

Есть ли способ, который уже делает это? (Может быть либо встроено в рубин в 2.2.2, либо добавлено рельсами 4.2.0).

ответ

1

Да, похоже, вы описывающее Array.wrap() расширение предоставляемой ActiveSupport в в Rails (active_support/core_ext):

>> list = ['a', :b, /c/] 
=> ["a", :b, /c/] 

>> Array.wrap(list) 
=> ["a", :b, /c/] 

>> map = {"a" => :foo, b: :bar, /c/ => 'baz'} 
=> {"a"=>:foo, :b=>:bar, /c/=>"baz"} 

>> Array.wrap(map) 
=> [{"a"=>:foo, :b=>:bar, /c/=>"baz"}] 

>> Array.wrap(:symbol_literal) 
=> [:symbol_literal] 

Вы можете найти документацию здесь: http://apidock.com/rails/Array/wrap/class. Метод Array(...) в ядре Ruby, библиотека имеет подобное поведение, но преобразует хэш вложенного массива:

>> Array(list) 
=> ["a", :b, /c/] 

>> Array(map) 
=> [["a", :foo], [:b, :bar], [/c/, "baz"]] # Probably not what you want 

>> Array(:symbol_literal) 
=> [:symbol_literal] 

Документация по ссылке, указанной выше, содержит более всеобъемлющее объяснение Array.wrap() против Array()

Смежные вопросы