我有以下课程,并希望在false
到达时返回step_two
的步骤:
class Something
def steps
step_one
step_two
step_three
end
private
def step_one
some_function
end
def step_two
if some_other_function
return false
end
true
end
def step_three
some_function
end
end
编写本文时,steps
方法不会在step_two
处停止执行,并将继续step_three
。我可以用这种方式编写它以使其工作:
def steps
step_one
return false unless step_two
step_three
end
或者,如果所有三个步骤都返回false:
def steps
return false unless step_one
return false unless step_two
return false unless step_three
end
有更好的方法吗?我想我问的是,如果调用的方法返回false,Ruby中的调用方法是否会返回false?
答案 0 :(得分:2)
只有在上一次返回true时才可以链接方法调用并有条件地执行更多步骤:
def steps
step_one and step_two and step_three
end
这样,steps
方法也会根据每个步骤的整体执行返回true或false - 即true表示所有步骤都已成功执行。
答案 1 :(得分:1)
由于您的方法step_two
返回false,因此问题是因为您的if
语句正在解析为false,并且很高兴进入step_three
。你有几个选择:
使用unless
运算符代替if
,如下所示:
def steps
step_one
return false unless step_two
step_three
end
或者您可以使用!
(非)运算符:
def steps
step_one
return false if !step_two
step_three
end
<强>更新强>
根据注释中的说明,如果任何其他方法调用返回false,则希望您的step
方法返回false;如果返回true,则返回true。实际上,就像这样:
def steps
step_one && step_two && step_three
end
在这种情况下,如果任何方法返回false,因为我们使用&&
(和)运算符,整个事情都会失败,并且您会收到false值。例如,如果step_one
返回true,并且step_two
返回false,则永远不会运行step_three
,并且整个操作的值将被解析为false。
答案 2 :(得分:0)
怎么样?
def steps
step_one
if step_two
step_three
end
end
这对你更好吗?