2012-03-11 56 views
9

有時候我想要一個變量永遠是一個數組,無論它是一個標量還是已經是一個數組。強制標量或數組成爲一個數組

所以我通常做:

[variable].flatten 

這與紅寶石1.8.5,1.8.7,1.9.x中兼容

使用此方法時,variable是一個字符串(variable = "asdf"),它給我["asdf"]。如果它已經是一個數組(variable = ["asdf","bvcx"]),它會給我:["asdf","bvcx"]

有沒有人有更好的方法? 「更好」意味着更可讀,更高效,簡潔或以其他方式更有效。

回答

13

我這樣做的方式,並認爲是標準的方式,使用[*...]

variable1 = "string" 
variable2 = ["element1", "element2"] 

[*variable1] #=> ["string"] 
[*variable2] #=> ["element1", "element2"] 
+1

我不知道lucapette的方式,這似乎工作,但我上面顯示的方式工作的速度大約是兩倍。 – sawa 2012-03-11 13:22:01

+0

在哪個實現? YARV? – 2012-03-11 20:53:17

+0

@AndrewGrimm是的。 YARV在Ruby 1.9.3中。 – sawa 2012-03-11 22:10:02

0

你可能會需要像Array.eat。大多數其他方法要麼在對象上調用#to_a#to_ary。如果你在哪裏使用[ obj ].flatten,可能會給出令人驚訝的結果。除非使用level參數調用,否則#flatten也會對嵌套數組進行調整,並會創建數組的額外副本。

主動支持提供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}] 
相關問題