将false返回给调用方法

时间:2014-11-03 17:07:29

标签: ruby-on-rails ruby

我有以下课程,并希望在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?

3 个答案:

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

这对你更好吗?