1. ホーム
  2. ruby

Rubyのクラス継承。<<` (double less than) とは何ですか?

2023-09-06 15:34:42

質問

class << Awesomeness

これは何ですか << は何のためにあるのでしょうか?検索しても、文字列の連結についてしか出てこないんですけど...。

どのように解決するのですか?

確かに class << something はシングルトンクラスのための構文ですが、他の誰かが言ったように、クラス定義の中でクラスメソッドを定義するために最も頻繁に使用されます。しかし、この2つの用法は一貫しています。以下はその方法です。

Rubyでは、このようにすることで、任意の特定のインスタンスにメソッドを追加することができます。

class << someinstance
  def foo
    "Hello."
  end
end

これはメソッドを追加します。 foo をそのクラスではなく、ある特定のインスタンスに追加しています。(実際には、foo はインスタンスの "singleton クラスに追加されますが、これは多かれ少なかれ実装上の癖です)。上記のコードが実行された後、メソッド foo を someinstance に送信することができます。

someinstance.foo   => "Hello."

というように、同じクラスの他のインスタンスにfooを送ることはできません。それは << は名目上そのためのものです。しかし、人々はより一般的にこの機能を次のような構文上の体操のために使用します。

class Thing
  def do_something
  end

  class << self
    def foo
      puts "I am #{self}"
    end
  end
end

このコード -- このクラス定義 -- が実行されるとき、何が起こるでしょうか? self ? それは、クラス Thing . ということは class << self は "クラス Thing." に次のメソッドを追加する、と言っているのと同じです。つまり、foo はクラスメソッドです。上記が完了すると、こんなことができるようになります。

t = Thing.new
t.do_something  => does something
t.class.foo     => "I am Thing"
t.foo           => NoMethodError: undefined method `foo'

そして、何を考えても << が何をしているのかを考えると、すべて納得がいきます。これは特定のインスタンスに追加する方法であり、一般的なケースでは追加されるインスタンスはクラスであるため、ブロック内のメソッドはクラスメソッドになります。

要するに、クラス定義ブロックの中にクラスメソッドを作成する簡潔な方法です。他の方法としては、こんな感じでしょうか。

class Thing
  def self.foo
    # ...
  end
end

同じことです。あなたの例は実際には構文エラーですが、もしあなたがどのように << がインスタンスと class キーワードでどのように使用されるかを理解すれば、それを修正する方法がわかるでしょう。