【问题标题】:Extra expression in method definition方法定义中的额外表达式
【发布时间】:2014-06-02 10:17:14
【问题描述】:

在这个例子中,方法定义中的最后一个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

【问题讨论】:

  • 它在计算上是等效的,但更清楚地表达了你对人类的意义。相关地,它还可以保护您,以防上面的代码发生更改。
  • 不仅如此——变量的存在毫无意义。你可以用if self == 5 then 'five' else 'fifty-eight' end替换方法体。
  • @Darshan,我不同意。所有那些不必要的代码行和不必要的局部变量都是混乱的。 Imo,读者可以更快地解析self == 5 ? 'five' : 'fifty-eight'(如@Donatas 所建议的那样),误读的机会更少。至于在末尾重复变量以防止代码更改,它可能会产生相反的效果。
  • @CarySwoveland 我绝对同意你的观点,如果该方法的那部分是可以争取的。我假设这是一个简化示例,用于询问有关最终 english 语句的值的问题。有很多方法看起来像这样,在计算上不需要放置最终语句,但为了清楚起见,我试图解释这个理由。

标签: ruby class methods


【解决方案1】:

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

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】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-21
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 2014-04-30
        相关资源
        最近更新 更多