ruby - ruby中 `next`与 `unless`时执行顺序混淆

标签 ruby

next 语句用于跳过循环的一部分并继续循环的下一次迭代。它可以与 forwhile 语句结合使用。

我见过有人在评估某些条件后出现复杂的代码时使用 next,即

next if @state!=:some_state
# some long complicated code

现在我已经在我的 IRB 中使用了 next 如下:

n = 1
loop do
  n = n + 1
  next unless n == 10
  print "Good"
  break
end
# Good=> nil

上面那个明白了。非常清晰。

n = 1
#=> 1
loop do
  print "#{n}"
  n = n + 1
  next puts "hi" unless n == 5
  p "good"
  break
end
#1hi
#2hi
#3hi
#4"good"
#=> nil

在上面的代码中,无法理解 puts "hi"unless n == 5 这几行的执行顺序。哪个先执行?

下面的代码会导致无限循环

n = 1
#=> 1
loop do
  print "#{n}"
  n = n + 1
  next puts "hi"; 2 + 3 unless n == 5
  p "good"
  break
end

而这个很好:

n = 1
#=> 1
loop do
  print "#{n}"
  n = n + 1
  next puts "hi", 2 + 3 unless n == 5
  p "good"
  break
end

#1hi
#5
#2hi
#5
#3hi
#5
#4"good"
#=> nil

请在这里帮助我理解 - 这个如何解决 forever 循环?

最佳答案

分号被评估为换行符,因此:

next puts "hi"; 2 + 3 unless n == 5

相当于:

next puts "hi"
2 + 3 unless n == 5

因此,next 将始终被调用,您将有一个无限循环。

逗号被评估为传递一组参数(被 puts 方法签名解释为数组),所以:

next puts "hi", 2 + 3 unless n == 5

相当于:

next puts("hi", 2 + 3) unless n == 5

关于 putsunless 的执行顺序 - 请考虑以下内容:

unless n == 5
  next puts "hi"
end

在这个例子中,很明显 unless 首先被评估,然后如果传递的条件被评估为 false 则执行 next puts "hi" 语句。嗯:

next puts "hi" unless n == 5

是完全相同的东西的简写。所以 unless 修饰符总是先被求值。自然地,如果您在中间插入一个分号,这将导致对它进行不同的评估,因为分号被评估为换行符。

关于ruby - ruby中 `next`与 `unless`时执行顺序混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15211827/

相关文章:

ruby - 如何在 Heroku 中设置 postgres 数据库

ruby-on-rails - Rails 安装 Ruby 2.1 失败

ruby - 如何将键盘按下/鼠标点击发送到 Ubuntu 中的其他 GUI 应用程序?

ruby-on-rails - 如何在 Rails 模型中重构复杂的搜索逻辑

ruby-on-rails - ruby 代码在模板中显示为 html

ruby - ruby 测试工具叫什么 'breaks' 你的代码,看看你的测试有多严格?

ruby - 未初始化的常量生成器 (NameError) - Ruby

ruby - 如何在 Ruby 1.9 中只获取有序哈希的一个子集?

ruby - 根据元素的索引连接数组元素

ruby-on-rails - 在Ruby(或Rails)中,按原样比较两个大字符串更快,还是在使用uniq之前将其转换为Fixnum更快?