Ruby 强制标量或数组成为数组
有时我希望变量始终是数组,无论它是标量还是已经是数组 所以我通常会:Ruby 强制标量或数组成为数组,ruby,Ruby,有时我希望变量始终是数组,无论它是标量还是已经是数组 所以我通常会: [variable].flatten 它与ruby-1.8.5、1.8.7、1.9.x兼容 当variable是一个字符串(variable=“asdf”)时,使用此方法,它会给我[“asdf”]。如果它已经是一个数组(variable=[“asdf”,“bvcx”]),它会给我:[“asdf”,“bvcx”] 有人有更好的方法吗?“更好”意味着更可读、更高效、简洁或在其他方面更有效 Array(variable) 我们应
[variable].flatten
它与ruby-1.8.5、1.8.7、1.9.x兼容
当variable
是一个字符串(variable=“asdf”
)时,使用此方法,它会给我[“asdf”]
。如果它已经是一个数组(variable=[“asdf”,“bvcx”]
),它会给我:[“asdf”,“bvcx”]
有人有更好的方法吗?“更好”意味着更可读、更高效、简洁或在其他方面更有效
Array(variable)
我们应该做到这一点。它使用鲜为人知的方法。我所做的,并且认为是标准的方法,是使用
[*…]
:
variable1 = "string"
variable2 = ["element1", "element2"]
[*variable1] #=> ["string"]
[*variable2] #=> ["element1", "element2"]
您可能需要类似于
Array.eat的东西。大多数其他方法对对象调用#到_a
或#到_ary
。如果您在哪里使用[obj]。展平
,可能会得到令人惊讶的结果<代码>#展平
还将损坏嵌套数组,除非使用级别参数调用,并将创建数组的额外副本
主动支持提供了Array.wrap
,但这也会调用#to_ary
,这可能是您喜欢的,也可能不是,取决于您的需要
require 'active_support/core_ext/array/wrap'
class Array
# Coerce an object to be an array. Any object that is not an array will become
# a single element array with object at index 0.
#
# coercing nil returns an empty array.
#
def self.eat( object )
object.nil? and return []
object.kind_of?( Array ) and return object
[object]
end
end # class Array
a = { a: 3 }
p [a].flatten # => [{:a=>3}]
p [*a] # => [[:a, 3]] -> OOPS
p Array a # => [[:a, 3]] -> OOPS
p Array.wrap a # => [{:a=>3}]
p Array.eat a # => [{:a=>3}]
我不知道Lucapete的方法,这似乎是可行的,但我上面展示的方法的工作速度大约是它的两倍。在哪个实现上?是吗?@Andrewgrim是的。Ruby 1.9.3中的YARV。我已经确认这个方法的性能更好,但是这个方法和数组(foo)方法都很好。请注意,这个方法总是会返回一个新数组
Kernal#Array
将返回相同的对象(如果给定了数组)。