【问题标题】:Understanding Ruby-code presented in book Practical Object Oriented Design了解《实用面向对象设计》一书中介绍的 Ruby 代码
【发布时间】:2015-12-16 15:06:55
【问题描述】:

我目前正在阅读名为Practical Object Oriented Design in Ruby 的书。我是 Ruby 新手,我知道只要你理解概念就不需要理解书中介绍的代码,我确实这样做了,但是我在第 2 章中找到的一段代码让我有点困扰。

在第 2 章中,作者展示了以下 Ruby 类...

class Gear  
    attr_reader :chainring, :cog  
    def initialize(chainring, cog)  
        @chainring = chainring 
        @cog       = cog  6    
    end  

     def ratio  
        chainring / cog.to_f 
    end 
end 

puts Gear.new(52, 11).ratio        
puts Gear.new(30, 27).ratio

我不明白的部分是她说这个类包含三个方法,chainringcogratio 但我只看到一个方法(ratio)和两个符号(@987654327 @ 和 cog)。

有人可以验证上面的代码并告诉我这是作者的错误还是实际上有三种方法?

书中引用:

每个实例实现三个方法:chainringcogratio

谢谢

【问题讨论】:

    标签: ruby


    【解决方案1】:

    attr_reader 隐式定义了两个方法(chainringcog):

    attr_reader :chainring, :cog  
    

    【讨论】:

    • 感谢您的澄清。我以为:chainring:cog 是符号,我在某处读到您使用冒号“:”定义符号。反正我也不熟悉符号。谢谢
    • @fs_tigre :chainring 是一个符号。它也是方法attr_reader() 的参数。此方法创建简单的 getter 方法。
    • @sschmeck 嗯,我需要阅读更多关于符号和访问器/阅读器的整个概念的信息。谢谢
    • fs,你也可以写attr_reader "chainring", :cog。 Ruby 的许多(大多数?全部?)方法(Module#attr_accessor 是一个)在表示方法时允许参数是符号或字符串。 (为什么不呢?)
    【解决方案2】:

    这些方法是使用attr_reader 宏创建的。您可以使用 instance_methods 显示示例中的所有方法。

    p Gear.instance_methods(false)
    #=> [:chainring, :cog, :ratio]
    

    【讨论】:

    • attr_reader 绝不是“宏”。这是在Module 类上定义的普通老好方法。
    • @mudasobwa 我称它为宏是因为它的用法。它在哪里定义并不重要。您如何在 Ruby 世界中定义宏?
    • 我不会。这个问题类似于“你如何定义松树世界中的‘叶子’”。 :)
    • 这里有一个类比,使用术语“操作符”来描述实际上是一种方法。不过,我必须支持@mudasobwa,因为“操作员”是官方 Ruby 文档的一部分(但从未定义过?),并且在每本关于 Ruby 的书籍中都出现过。相比之下,我不记得在这些地方看到过“宏”(包括 Metaprogramming Ruby,尽管我不怀疑它的存在)。此外,该术语可能会使熟悉 C 类型宏的 Ruby 新手感到困惑。最后,通过使用“方法”这个词,你是在教育那些没有意识到它是什么的读者。
    • @CarySwoveland 是的,我要提防那些将“宏”一词视为与C-type 宏有共同之处的新手。遇到真正面向对象的语言并接受它的范式是一个挑战。另一方面,Elixir 进化了“宏观”术语,甚至使其可以接受 :) 所以,我不确定我是否喜欢“宏观”术语,但无论如何,“你在教育那些没有意识到它是什么的读者。 ”感谢您指出这一点。
    【解决方案3】:
    attr_reader :chainring, :cog  
    

    等价于

    def chainring
      @chainring
    end
    
    def cog
      @cog
    end
    

    手工编写这样的方法很无聊,所以 ruby​​ 提供了一个捷径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多