方法定义中的额外表达式

时间:2014-04-17 23:21:11

标签: ruby class methods

在这个例子中,方法定义中的最后一个english似乎对我来说是不必要的。我把它拿出来,代码工作得很好。为什么这本书包括它?是否有某种我不知道的惯例?

class Integer
  def to_eng
    if self == 5
      english = 'five'
    else
      english = 'fifty-eight'
    end
    english  
  end
end

#  I'd better test on a couple of numbers...
puts 5.to_eng
puts 58.to_eng

3 个答案:

答案 0 :(得分:2)

在ruby中,始终从函数返回最后一个语句的结果。在这种情况下,结果是'english'变量的值。但是,如果我们删除方法的最后一行,它仍然表现相同,因为两行都返回在'english'变量上设置的值。

english = 'five' #=> 'five'
english = 'fifty-eight' #=> 'fifty-eight'

此方法也可以使用三元运算符以更紧凑和更优雅的方式编写。

class Integer
  def to_eng
    self == 5 ? 'five' : 'fifty-eight'
  end
end

答案 1 :(得分:2)

对我来说,最好的理由是可调试性。在展示的代码中,您可以在返回之前插入调试语句,并知道结果:

class Integer

  def to_eng
    if self == 5
      english = 'five'
    else
      english = 'fifty-eight'
    end

    debugger
    # or: puts "ENGLISH IS #{english}"
    # or: binding.pry
    # or whatever else you want

    english  
  end

end

如果您不使用最后一个english,则无法执行此操作,因为返回值会发生变化。

答案 2 :(得分:0)

它确保了本地变量' english'退回。方法中最后执行的语句是返回的内容。

在这种情况下,不需要它,但如果(例如)该方法被重写为...

def to_eng
  english = 'fifty-eight'
  english = 'five' if self == 5
end

...你会发现除了5以外的任何数字都没有返回任何数字,因为最后一个语句......没有被执行......只会返回nil。