我做了一个小程序来计算数组中的单词:
array = ["first line",
"second line",
"",
" fourth line containing a few more words ",
"fifth line "]
words = 0
array.each do |s|
wis = 0
s.length.times do |i|
if i == 0
if s[i] != " "
wis = 1
next #HERE IT COMES.
end
end
if s[i] != " " and s[i-1] == " "
wis += 1
end
end
words += wis
end
puts "Words in the array: #{words}"
输出:
Words in the array: 13
它运作正常,但有一件我无法理解的事情。我知道next
关键字离开了当前的迭代,但我不知道它在这里是如何工作的。如果我从代码中省略它,则输出将为Words in the array: 14
。我知道next
可以替换为else
条件,这就是问题 - 我不知道如何定义它。
您能解释一下next
在代码中的工作原理吗?
您是否可以在不使用if
关键字的情况下为next
条件提供替代解决方案?
谢谢
答案 0 :(得分:3)
在使用next
时,建议您阅读this answer here。
关于你的代码,我可以告诉你,学习Ruby需要对你的编程方式进行更大的改变。这不仅仅是使用Ruby语法的问题,也是探索Ruby潜力以使事情变得简单的问题。
例如,您可以在没有if
的情况下完成任务。
array = ["first line",
"second line",
"",
" fourth line containing a few more words ",
"fifth line "]
count = array.inject(0) { |c, item| c + item.strip.split(" ").count }
puts count
这会给你
13
这正是单词的数量,而且根本没有if
。
这甚至不是最好的方式。我相信这可以做得更短。
答案 1 :(得分:3)
正如其他人所说,在Ruby中有很多更优雅的方法来编写字数。但是,我会尝试回答您的具体问题,因为这里仍有待学习的内容。
正如您所提到的,next
离开了当前的迭代。在您的示例中,这意味着当i == 0
条件和s[i] != " "
条件都为真时,next
将执行,并且if s[i] != " " and s[i-1] == " "...
部分将跳过该迭代。< / p>
删除next
时获取14个单词的原因依赖于知道当字符串使用负索引时会发生什么。在这一行:
if s[i] != " " and s[i-1] == " "
当i
为0时,这相当于
s[0] != " " and s[-1] == " "
s[-1]
表示字符串的最后一个字符。这对于"fifth line "
行是正确的,因此结果是该行的第一个单词被计算两次。
要将next
替换为else
条件,您需要安排替代方式,if s[i] != " " and s[i-1] == " "...
如果i == 0 and s[i] != " "
不执行,请执行以下操作:
if i == 0 and s[i] != " "
wis = 1
elsif s[i] != " " and s[i-1] == " "
wis += 1
end
答案 2 :(得分:3)
使用“next”关键字的简单示例
(1..10).each do |a|
next if a.even?
puts a
end
输出: -
1
3
5
7
9
在块中使用next:当在块中使用next时,它会导致块立即退出,将控制返回到迭代器方法,然后可以通过调用方法开始新的迭代再次阻止
答案 3 :(得分:1)
接下来跳回到代码块的开头,在这种情况下跳转到下一个数组元素。
如何更好地做到这一点的最短答案是恕我直言这个
puts "Words in the array: #{array.join(' ').split(/\W+/).length}"
# Words in the array: 13
一些解释:
在处理字符串时,通常最好使用正则表达式,以便于我开始将所有数组元素组合到一个字符串:array.join(' ')
该空间用作分隔符以防止单词连接在一起。
这个字符串再次与//&#39;之间的正则表达式分开,即\ W +,这意味着一系列非分隔符(因此是一个单词)。
这个数组取长度,因此给出字符串/数组中的单词数。
编辑:使用扫描而不是分割和计数而不是长度8,它的两个字符更短:)
array.join(' ').scan(/\W+/).count