什么是正确的方法:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
还是要获取其中的物品计数?
什么是正确的方法:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
还是要获取其中的物品计数?
Answers:
您可能要使用kind_of()
。
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
kind_of?()
其他解决方案?关于您的答案相对于他人的益处的一些解释将对将来的读者有所帮助。
你肯定需要是一个数组?您可能可以使用,respond_to?(method)
因此您的代码将可用于不一定是数组的类似事物(也许还有其他可数的事物)。如果确实需要array
,则描述该Array#kind\_of?
方法的帖子最好。
['hello'].respond_to?('each')
respond_to?(:to_ary)
。
无需测试Array,
即可将任何内容转换为一个级别,Array,
因此您的代码只需处理一种情况。
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
Ruby有多种协调API的方法,可以采用一个对象或一个对象数组,因此,猜测为什么要知道某个对象是否为数组,我有一个建议。
该图示操作含有大量的魔法你可以看一下,或者你可以拨打Array(something)
如果需要的话,这将增加一个阵列封装。这与[*something]
这种情况相似。
def f x
p Array(x).inspect
p [*x].inspect
end
f 1 # => "[1]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
或者,您可以在参数声明中使用splat,然后使用.flatten
,从而为您提供了另一种收集器。(为此,您也可以.flatten
在上面致电。)
def f *x
p x.flatten.inspect
end # => nil
f 1 # => "[1]"
f 1,2 # => "[1, 2]"
f [1] # => "[1]"
f [1,2] # => "[1, 2]"
f [1,2],3,4 # => "[1, 2, 3, 4]"
而且,感谢gregschlom,使用它有时有时会更快,Array(x)
因为当它已经存在时,Array
它不需要创建新对象。
[*nil] => []
。因此,您可能最终会得到一个空数组。
Array(foo)
效率比[*foo]
[1,2,3].is_a? Array
评估为true。
is_a?
整个线程。最接近的是[1,2,3].is_a? Enumerable
。我仍然认为值得一试。
尝试:
def is_array(a)
a.class == Array
end
编辑:另一个答案比我的要好得多。
还可以考虑使用Array()
。从《Ruby社区风格指南》中:
在处理要作为数组对待的变量时,请使用Array()而不是显式的Array check或[* var],但不确定是数组。
# bad
paths = [paths] unless paths.is_a? Array
paths.each { |path| do_something(path) }
# bad (always creates a new Array instance)
[*paths].each { |path| do_something(path) }
# good (and a bit more readable)
Array(paths).each { |path| do_something(path) }
to_a
在添加到新数组的每个参数上都会调用,因此Array({id: 100})
返回[[:id, 100]]