0

我有以下代码

s = 'string1, string2, string3, string4'

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

获取数组大小的最佳方法是什么?是否有一种方法可以在传递给循环的拆分的同一行上调用?

4

3 回答 3

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 个字符。

于 2012-09-08T08:25:00.643 回答
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属性是在生成时设置的,并在将对象删除和添加到数组时进行更新。

于 2012-09-08T03:10:06.233 回答
0

这是一种更快的方法:

s = 'string1, string2, string3, string4'
(length = s.count(',')) && (length + 1).times{|i| puts "line #{i} of #{length}" }
于 2012-09-08T03:29:50.340 回答