【问题标题】:Ruby syntax question: Rational(a, b) and Rational.new!(a, b)Ruby 语法问题:Rational(a, b) 和 Rational.new!(a, b)
【发布时间】:2011-05-01 08:31:35
【问题描述】:

今天我在 Rational 类中遇到了奇怪的 ruby​​ 语法:

Rational(a,b)

(请注意,与正常的 Ruby 语法相比,.new()portion 的缺失)。与正常的new 语法相比,这意味着什么?更重要的是,我如何在自己的代码中实现这样的东西,我为什么要实现这样的东西?专门针对Rational 类,为什么使用这种语法而不是普通的实例化?为什么new 方法在理性类中是私有的? (以及我如何/为什么要在自己的 ruby​​ 代码中执行此操作?) 提前感谢您的回答,特别是因为我问了这么多问题。

【问题讨论】:

    标签: ruby syntax constructor instantiation parentheses


    【解决方案1】:

    您所要做的就是声明一个与您的类同名的全局函数。这就是rational.rb 所做的:

    def Rational(a, b = 1)
      if a.kind_of?(Rational) && b == 1
        a
      else
        Rational.reduce(a, b)
      end
    end
    

    将构造函数设为私有:

    private :initialize
    

    对于new 方法也是如此:

    private_class_method :new
    

    我想Rational.new 可以保持公开,并让其做Rational() 所做的事情,但是拥有将其参数转换为实例的方法与Array()String() 等一致。这是一个熟悉的模式易于实施和理解。

    【讨论】:

      【解决方案2】:

      方法 Rational() 实际上是定义在类 Rational外部 的实例方法。因此,它成为任何对象加载库 'rational'(通常是 main:Object)的实例方法,就像 'puts' 一样。

      按照惯例,此方法通常是同名类的构造函数。

      【讨论】:

      • 这是对@Wayne Conrad 回答的一个非常重要的补充。感谢您的意见。
      • 确实如此。我将“函数”更改为“全局函数”,希望这能让我的答案更清晰。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2014-03-29
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      相关资源
      最近更新 更多