[解決済み] Rubyのclass << selfイディオム
質問
とは何ですか?
class << self
で行います。
ルビー
?
どのように解決するのですか?
まず
class << foo
構文が開く
foo
のシングルトン・クラス(eigenclass)です。これにより、その特定のオブジェクトに対して呼び出されるメソッドの振る舞いを特殊化することができます。
a = 'foo'
class << a
def inspect
'"bar"'
end
end
a.inspect # => "bar"
a = 'foo' # new object, new singleton class
a.inspect # => "foo"
では、質問にお答えします。
class << self
開く
self
のシングルトンクラスでメソッドを再定義することができます。
self
オブジェクト(クラスやモジュールのボディの中では、クラスやモジュールの
それ自体
). 通常、クラスやモジュールの ("static") メソッドを定義するために使用されます。
class String
class << self
def value_of obj
obj.to_s
end
end
end
String.value_of 42 # => "42"
これは省略形として書くこともできる。
class String
def self.value_of obj
obj.to_s
end
end
もっと短くてもいい。
def String.value_of obj
obj.to_s
end
関数定義の中にある場合。
self
は、その関数が呼び出されるオブジェクトを参照します。この場合
class << self
はそのオブジェクトのシングルトンクラスを開きます。このクラスは、貧乏人のステートマシンを実装するために使われることがあります。
class StateMachineExample
def process obj
process_hook obj
end
private
def process_state_1 obj
# ...
class << self
alias process_hook process_state_2
end
end
def process_state_2 obj
# ...
class << self
alias process_hook process_state_1
end
end
# Set up initial state
alias process_hook process_state_1
end
つまり、上記の例では、各インスタンスの
StateMachineExample
は
process_hook
にエイリアスされています。
process_state_1
を再定義することができることに注意してください。
process_hook
(この場合
self
のみで、他の
StateMachineExample
インスタンス)から
process_state_2
. そのため、呼び出し元が
process
メソッド (これは再定義可能な
process_hook
)、どのような状態であるかによって動作が変わります。
関連
-
[解決済み] Rubyで日付文字列をパースする
-
[解決済み] Capybaraを使ったドロップダウンでのオプションの選択方法
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyで文字列を小文字・大文字に変換する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
最新
-
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 プログラムに一定時間待つように指示する
-
[解決済み] RubyのHashをキーでアルファベット順にソートする方法
-
[解決済み] Gem::Specification.reset中に未解決のスペックがある。
-
[解決済み] Ruby on Railsでホスト名やIPを取得する
-
[解決済み] Ruby: 文字列をブーリアンに変換する方法
-
[解決済み] Ruby Net::HTTPの実行期限が切れた
-
[解決済み] .rb(Ruby)ファイルを表示するにはどうすればよいですか?
-
[解決済み] Ruby 1.8.7 ハッシュを文字列に変換する
-
[解決済み] Rubyの@@variableはどういう意味ですか?
-
[解決済み】Rubyのクラスインスタンス変数とクラス変数の比較