我有以下代码
s = 'string1, string2, string3, string4'
s.split(",").each_with_index{ |element, index| puts "line #{index} of #{size_of_array}" }
获得数组大小的最佳方法是什么?有没有一种方法可以调用传递给循环的分割的同一行?
答案 0 :(得分:2)
我认为你正在寻找点击:
s.split(',').tap{|a| a.size.times{|i| puts "line #{i} of #{a.size}"}}
但实际上,只是一个;在同一条线上尽可能多地保留:
a = s.split(','); a.size.times{|i| puts "line #{i} of #{a.size}"}
注意大小而不是长度,因为它的缩短时间为2个字符。
答案 1 :(得分:1)
要获得数组的大小,只需在其上调用.length
即可。现在,我不认为你可以在同一行上做到这一点,以下是否适合你:?
s = 'string1, string2, string3, string4'
split_s = s.split()
split_s.each_with_index{ |element, index| puts "line #{index} of #{split_s.length}"}
如果这是不可接受的,请告诉我,我会看看是否还有其他事情可以做。
<强>更新强>
如果你想把它全部放在一行,就会有很多冗余。例如,你可以这样做:
s = 'string1, string2, string3, string4'
s.split(",").each_with_index{ |element, index| puts "line #{index} of #{s.split(',').length}" }
但是你看到了冗余吗?为每个元素调用s.split(',')。这就是我建议将其存储在上述不同行中的原因。
更新2
根据下面的注释,在调用split_s.length
循环之前存储each_with_index
也是有效的,因为它也将遍历元素。谢谢评论者!我之前曾假设length
属性是在生成时设置的,并在删除对象并将对象添加到数组时进行更新。
答案 2 :(得分:0)
这是一种更快捷的方式:
s = 'string1, string2, string3, string4'
(length = s.count(',')) && (length + 1).times{|i| puts "line #{i} of #{length}" }