Ruby 方法定义中的额外表达式

Ruby 方法定义中的额外表达式,ruby,class,methods,Ruby,Class,Methods,在本例中,方法定义中的最后一个英语,对我来说似乎没有必要。我把它拿了出来,代码也运行得很好。这本书为什么包括它?有什么我不知道的惯例吗 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..

在本例中,方法定义中的最后一个
英语
,对我来说似乎没有必要。我把它拿了出来,代码也运行得很好。这本书为什么包括它?有什么我不知道的惯例吗

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

它确保返回局部变量“english”中的值。方法中最后执行的语句是返回的语句

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

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

。。。您会发现,除了5之外,任何数字都不会返回任何内容,因为最后一条语句。。。没有被处决。。。只返回nil。

它确保返回局部变量'english'中的值。方法中最后执行的语句是返回的语句

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

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

。。。您会发现,除了5之外,任何数字都不会返回任何内容,因为最后一条语句。。。没有被处决。。。只返回nil。

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

english = 'five' #=> 'five'
english = 'fifty-eight' #=> 'fifty-eight'
此外,该方法还可以使用三元运算符以更简洁、优雅的方式编写

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

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

english = 'five' #=> 'five'
english = 'fifty-eight' #=> 'fifty-eight'
此外,该方法还可以使用三元运算符以更简洁、优雅的方式编写

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

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

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

如果您不使用最后一个
英语
,您就不能这样做,因为返回值会改变。

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

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

如果你不使用最后一个
英语
,你就无法做到这一点,因为返回值会发生变化。

它在计算上是等价的,但更清楚地向人类表达了你的意思。与此相关的是,它还可以在上述代码发生更改时保护您。除此之外,变量的存在是毫无意义的。如果self==5,则可以用
替换方法体,如果self==5,则用'five'替换,否则用'558'结束
@Darshan,我不同意。所有那些不必要的代码行和不必要的局部变量都是杂乱无章的。依我看,读者可以解析
self==5?“5':'58'
(正如@Donatas所建议的那样)速度更快,误读的机会更少。至于在结尾重复变量以防止代码发生更改,可能会产生相反的效果。@CarySwoveland我完全同意你的观点,如果该方法的这一部分可以使用的话。我假设这是一个简单的示例,用于询问关于最后
英语
语句的值的问题。有很多方法看起来像这样,在计算上没有必要放置一个最终声明,但这样做是为了清晰,我试图解释这个原理。它在计算上是等价的,但更清楚地表达了你对人类的意义。与此相关的是,它还可以在上述代码发生更改时保护您。除此之外,变量的存在是毫无意义的。如果self==5,则可以用
替换方法体,如果self==5,则用'five'替换,否则用'558'结束
@Darshan,我不同意。所有那些不必要的代码行和不必要的局部变量都是杂乱无章的。依我看,读者可以解析
self==5?“5':'58'
(正如@Donatas所建议的那样)速度更快,误读的机会更少。至于在结尾重复变量以防止代码发生更改,可能会产生相反的效果。@CarySwoveland我完全同意你的观点,如果该方法的这一部分可以使用的话。我假设这是一个简单的示例,用于询问关于最后
英语
语句的值的问题。有许多方法看起来像这样,在计算上没有必要放置一个最终声明,但这样做是为了清晰,我试图解释这个原理。