我有以下代码
s = 'string1, string2, string3, string4'
s.split(",").each_with_index{ |element, index| puts "line #{index} of #{size_of_array}" }
获取数组大小的最佳方法是什么?是否有一种方法可以在传递给循环的拆分的同一行上调用?
我认为您正在寻找水龙头:
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 个字符。
要获取数组的大小,您只需调用.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
属性是在生成时设置的,并在将对象删除和添加到数组时进行更新。
这是一种更快的方法:
s = 'string1, string2, string3, string4'
(length = s.count(',')) && (length + 1).times{|i| puts "line #{i} of #{length}" }