Rubyのクラス継承。<<` (double less than) とは何ですか?
質問
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 キーワードでどのように使用されるかを理解すれば、それを修正する方法がわかるでしょう。
関連
-
[解決済み] Rubyのコロン演算子とは何ですか?
-
[解決済み] ルビースリープやディレイは1秒以下?
-
[解決済み] Rubyのダブルコロン `::` とは何ですか?
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] Rubyのclass << selfイディオム
-
[解決済み] Rubyのmap(&:name)ってどういう意味?
-
[解決済み] Rubyのクラス名を取得する方法を教えてください。
-
[解決済み] ルビーです。インスタンスからクラスメソッドを呼び出す
-
[解決済み】Rubyで配列を反復処理するための「正しい」方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rubyの<<はどういう意味ですか?
-
[解決済み] Hash each ループでインデックスにアクセスすることは可能ですか?
-
[解決済み] key => "value"`と`key: "value"`のハッシュ表記に違いはありますか?
-
[解決済み] Ubuntu 14.04にRuby 2.1.4をインストールする方法
-
[解決済み] インストールされているすべてのGemsを削除して最初からやり直す
-
[解決済み] 最大値のハッシュのキーはどのように見つけるのですか?
-
[解決済み] 既存の文字列に追加する
-
[解決済み] Rubyで配列の最後の要素を取得するには?
-
[解決済み] Mavericks と Xcode 5.1 で Ruby Gem install Json が失敗する - unknown argument: '-multiply_definedsuppress'.
-
[解決済み] eigenclassはself.classと同じように見えるのに、なぜ違うのですか?