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
将返回相同的对象(如果给定了数组)。