在Ruby中,循环语句的返回值是什么?

6
使用以下代码:
  def get_action
    action = nil
    until Guide::Config.actions.include?(action)
      puts "Actions: " + Guide::Config.actions.join(", ")
      print "> "
      user_response = gets.chomp
      action = user_response.downcase.strip
    end
    return action
  end

以下代码获取用户响应,最终将其操作返回给另一个方法。
我知道循环会一直重复直到最终被打破,但是我对返回值很好奇,这样下次我就可以更好地构建循环了。在until循环中,我想知道until循环返回什么值,如果有的话?

询问循环 until some condition .... end 的返回值(不一定是这个例子,但通常情况下),类似于方法的返回值是最后一行或使用 return 关键字。 - developer098
return会终止循环。正如mits所说,赋值x = ... etc会将nil赋给x - Sagar Pandya
@sagarpandya82,将x分配给循环将分配x给内部break返回的内容。默认情况下它是nil,但您可以显式地返回break "something",这样循环的结果将是“something”。 - fl00r
当我尝试这样做时,我一直收到“<main>:unexpected return (LocalJumpError)”错误。 - Sagar Pandya
@sagarpandya82请查看x = loop do break "something"; end - fl00r
显示剩余2条评论
2个回答

8

循环结构(loopwhileuntil等)的返回值可以是你发送给break的任何东西。

def get_action
  loop do
    action = gets.chomp
    break action if Guide::Config.actions.include?(action)
  end
end

或者

def get_action
  while action = gets.chomp
    break action if Guide::Config.actions.include?(action)
  end
end

或者你可以使用 begin .. while

def get_action
  begin
    action = gets.chomp
  end while Guide::Config.actions.include?(action)
  action
end

甚至更短
def get_action
  action = gets.chomp while Guide::Config.actions.include?(action)
  action
end

提示:循环本身会将nil作为结果返回(隐式的break语句等同于break nil),除非你使用显式的break "something"。如果你想要把循环的结果赋值给变量,你应该使用break语句:x = loop do break 1; end


所以循环不会返回任何东西,除非您放置一个 break 语句,而该 break 语句的工作方式类似于方法中的 return - developer098
break 会从循环中返回某个值,因此您可以将其分配给一个变量并继续执行方法。return 将立即退出方法。 - fl00r
2
@programmer321:是的,break会a)立即终止循环,并b)使循环按照传递给break的值进行评估,就像return会立即终止方法(或lambda)并使方法调用按照传递给return的值进行评估一样,next会立即终止块并使块按照传递给next的值进行评估。主要区别在于如果不使用相应的关键字会发生什么:块、方法和lambda(以及模块和类定义)将评估为最后一个被评估的表达式的值。 - Jörg W Mittag
2
然而,whileuntil循环的计算结果为nil。另一方面,for/in迭代器是each的语法糖,并且仅计算each的返回值(根据标准协议,该值为self,但不以任何方式强制执行)。 - Jörg W Mittag
优秀的分析,@JörgWMittag! - developer098

0

loop 可以在不使用 break 的情况下返回一个值

def loop_return
  @a = [1, 2, 3 ].to_enum
  loop do
    @a.next
  end
end

print loop_return  #=> [1, 2, 3]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接