是否有更简洁,更简洁的内置方法将元素包装在ruby中的迭代中?

时间:2016-03-29 21:31:34

标签: ruby

此代码有效:

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

permission中的内容可以是符号或任何序列(例如,数组)。如果传递单个元素,则将其包装在数组中。

有没有一种方法可以做到这一点? (可以是2.2.2中的ruby内置或者是rails 4.2.0添加的。)

1 个答案:

答案 0 :(得分:1)

是的,您似乎在Rails(Array.wrap())中描述ActiveSupport提供的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。 核心Ruby库中的Array(...)方法具有类似的行为,但会将哈希转换为嵌套数组:

>> 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() vs Array()

的更全面的解释