'Next'关键字在特定的Ruby代码中被误解

时间:2016-11-20 16:37:33

标签: ruby next

我做了一个小程序来计算数组中的单词:

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条件提供替代解决方案?

谢谢

4 个答案:

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