6

今日、私はRationalクラスで奇妙なRuby構文に出くわしました:

Rational(a,b)

.new()(通常の Ruby 構文と比較して、この部分がないことに注意してください)。new通常の構文と比較して、これは正確には何を意味するのでしょうか? さらに重要なことは、このようなものを自分のコードに実装するにはどうすればよいでしょうか? また、なぜこのようなものを実装するのでしょうか? 特にRationalクラスの場合、通常のインスタンス化の代わりにこの構文が使用されるのはなぜですか? そして、なぜnew合理的なクラスでメソッドがプライベートなのですか? (そして、自分の Ruby コードでこれをどのように/なぜ行うのでしょうか?) 特に非常に多くの質問をしてきたので、回答をよろしくお願いします。

4

2 に答える 2

6

クラスと同じ名前のグローバル関数を宣言するだけです。そしてそれが 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()、 などと一貫性があります。

于 2010-10-27T14:27:04.023 に答える
3

メソッド Rational() は、実際にはクラス Rational の外部で定義されたインスタンス メソッドです。したがって、たとえば「puts」と同じ方法でライブラリ「rational」(通常は main:Object) をロードするオブジェクトのインスタンス メソッドになります。

慣例により、このメソッドは通常、同じ名前のクラスのコンストラクターです。

于 2010-10-27T14:37:22.160 に答える