正确的方法是什么:
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)
或者获取其中的条目数?
当前回答
听起来你想要的东西有一些项目的概念。因此,我建议看看它是否是可枚举的。这也保证了#count的存在。
例如,
[1,2,3].is_a? Enumerable
[1,2,3].count
注意,虽然size, length和count都适用于数组,但count在这里是正确的含义-(例如,'abc'。长度和abc。Size和abc都可以。Count不是这样工作的)。
注意:字符串is_a?可枚举的,所以也许这不是你想要的…这取决于你对数组的概念,比如object。
其他回答
你确定它需要是一个数组吗?您可以使用respond_to?(method),这样您的代码就可以用于类似的东西,不一定是数组(可能是其他一些可枚举的东西)。如果你确实需要一个数组,那么描述数组#kind\_of?方法是最好的。
['hello'].respond_to?('each')
也可以考虑使用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) }
Try:
def is_array(a)
a.class == Array
end
编辑:另一个答案比我的好得多。
不需要测试数组,只需将您得到的任何东西转换为一级数组,因此您的代码只需要处理一种情况。
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
Ruby有多种方法来协调API,这些API可以接受对象或对象的数组,所以,猜测一下为什么你想知道某个东西是否是数组,我有一个建议。
splat操作符包含许多可以查找的神奇功能,或者您可以直接调用Array(什么),它将在需要时添加Array包装器。在这种情况下,它类似于[*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 above。)
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时,它不需要创建一个新对象。
(1、2、3).is_a吗?数组的计算结果为true。