Ruby - 如何从 IF 代码块中退出

19

在IF块中,我需要检查某个条件是否为真,如果是,就退出该块。

#something like this
if 1 == 1
  return if some_object && some_object.property
  puts 'hello'
end

我该如何做到这一点?

3个回答

20

你不能像那样跳出一个 if。你可以在其中添加一个子句:

if (cond1)
  unless (cond2)
    # ...
  end
end

如果您的逻辑太嵌套,需要更好地将其展开,请尝试预先计算变量,只有在需要时才进行深入处理:

will_do_stuff = cond1
will_do_stuff &&= !(some_object && some_object.property)

if (will_do_stuff)
  # ...
end

避免深度嵌套结构的方法有很多,而且不必使用 break语句。


3
事先计算变量并为条件指定名称,可以获得+1分。一个好的名称将极大地提高可读性。 - Mark Thomas
我建议避免这种情况并定义更多的方法,如果需要的话。这是Rails使用的模式,它非常有效。将方法拆分为尽可能小的原子操作 - 在这种情况下,可以使用同一类/对象中的另一个(私有?)方法来测试此条件。例如 def will_parse? (obj); !obj.nil?&& obj.respond_to? (:parse) && obj.is_ready_and_willing?; end - coreyward
4
&&=||= 的按位与等效形式,因此 a &&= b 等同于 a && a = b。因此,如果 a 为真值,那么将 b 的值赋给 a - coreyward
1
@coreward:定义方法确实是重构的一种方式,使用像should_do_x?这样的辅助方法而不是一堆复杂的逻辑是一个很好的方法,但在这种情况下,有多少逻辑并不清楚。 - tadman

2

在选择与事物相关联的词语时要小心。因为Ruby有块,所以我不确定您是否认为条件语句是一个块。例如,您不能执行以下操作:

# will NOT work:
block = Proc.new { puts "Hello, world." }
if true then block

如果你需要嵌套条件语句,你可以轻松实现,而不会让事情变得复杂:

if condition_one?
  if condition_two?
    # do some stuff
  end
else
  # do something else
end

这有点误导人,因为如果你将第一个片段的第二行改为 if true then block.call end,那么它就可以工作了。 - DaveMongoose
@DaveMongoose 这是因为您正在对 Proc 实例调用 'call' 方法,但感谢您的负评。 - coreyward
在 Ruby 中是否存在某些东西的反例,它是一个块但可以替换为 Proc 实例(如 block)?我认为语法要求它必须是 &block,如果你要将其用作显式块的替代。 - DaveMongoose

0

不必使用if,你可以使用一个实际上从不循环的while循环,并在适当的位置放置中断。

while some·condition
  something·likely
  break unless some·additional·condition
  something·less·likely
  break
end

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