什么是正确的方法:
is_array("something") # => false (or 1)
is_array(["something", "else"]) # => true (or > 1)
Run Code Online (Sandbox Code Playgroud)
或者计算其中的物品数量?
ry.*_*ry. 504
你可能想用kind_of?()
.
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
Run Code Online (Sandbox Code Playgroud)
zgc*_*rch 146
你确定它需要是一个阵列吗?您可以使用,respond_to?(method)
因此您的代码可以用于类似的事情,这些事情不一定是数组(也许是其他一些令人难以理解的事情).如果你确实需要一个array
,那么描述该Array#kind\_of?
方法的帖子是最好的.
['hello'].respond_to?('each')
Run Code Online (Sandbox Code Playgroud)
Dig*_*oss 57
而不是测试Array,
只是转换为一个级别的任何东西,Array,
所以你的代码只需要处理一个案例.
t = [*something] # or...
t = Array(something) # or...
def f *x
...
end
Run Code Online (Sandbox Code Playgroud)
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]"
Run Code Online (Sandbox Code Playgroud)
或者,您可以在参数声明中使用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]"
Run Code Online (Sandbox Code Playgroud)
并且,感谢gregschlom,它有时更快才被使用,Array(x)
因为当它已经是一个Array
它不需要创建一个新对象.
dip*_*ent 20
[1,2,3].is_a? Array
评估为真.
Pet*_*ter 15
这听起来像是在追求具有某些物品概念的东西.我因此建议看看它是不是Enumerable
.这也保证了存在#count
.
例如,
[1,2,3].is_a? Enumerable
[1,2,3].count
Run Code Online (Sandbox Code Playgroud)
值得注意的是,虽然size
,length
和count
数组的所有工作,count
是在这里的意思- (例如,'abc'.length
和'abc'.size
两个工作,但'abc'.count
好像不工作).
警告:字符串is_a?可枚举,所以也许这不是你想要的......取决于你的对象数组的概念.
Luc*_*nes 10
尝试:
def is_array(a)
a.class == Array
end
Run Code Online (Sandbox Code Playgroud)
编辑:另一个答案比我的好得多.
还考虑使用Array()
.来自Ruby社区风格指南:
在处理要作为数组处理的变量时,使用Array()而不是显式数组检查或[*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) }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
200632 次 |
最近记录: |