使用#split方法迭代字符串,如何获取元素的总数

时间:2012-09-08 03:03:03

标签: ruby split loops

我有以下代码

s = 'string1, string2, string3, string4'

s.split(",").each_with_index{ |element, index| puts "line #{index} of #{size_of_array}" }

获得数组大小的最佳方法是什么?有没有一种方法可以调用传递给循环的分割的同一行?

3 个答案:

答案 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}" }