[解決済み] Rubyのモジュール/ミキシンからクラスメソッドを継承する
2022-12-22 13:11:27
質問
Rubyでは、クラスメソッドは継承されることが知られています。
class P
def self.mm; puts 'abc' end
end
class Q < P; end
Q.mm # works
しかし、mixinで動作しないのは驚きです。
module M
def self.mm; puts 'mixin' end
end
class N; include M end
M.mm # works
N.mm # does not work!
#extendメソッドでできることは知っています。
module X; def mm; puts 'extender' end end
Y = Class.new.extend X
X.mm # works
しかし、私はインスタンスメソッドとクラスメソッドの両方を含むmixinを書いています(というか、書きたいと思っています)。
module Common
def self.class_method; puts "class method here" end
def instance_method; puts "instance method here" end
end
さて、私がやりたいことはこれです。
class A; include Common
# custom part for A
end
class B; include Common
# custom part for B
end
A, B にインスタンスメソッドとクラスメソッドを継承させたい。
Common
モジュールに継承させたいのです。しかし、もちろん、それはうまくいきません。そこで、この継承を1つのモジュールから動作させる秘密の方法はないでしょうか?
これを2つの異なるモジュールに分割して、一方はインクルード、もう一方はエクステンションにするのは、私には非礼に思えます。もうひとつの可能な解決策は、クラス
Common
を使用することです。しかし、これは単なる回避策に過ぎません。(共通の機能として2つのセットがある場合はどうでしょう
Common1
と
Common2
といった具合に、本当にmixinが必要なのでしょうか?) mixinからクラスメソッドの継承がうまくいかないのは、何か深い理由があるのでしょうか?
どうすればいいのでしょうか?
よくある慣用句として
included
フックを使用し、そこからクラスメソッドを注入することです。
module Foo
def self.included base
base.send :include, InstanceMethods
base.extend ClassMethods
end
module InstanceMethods
def bar1
'bar1'
end
end
module ClassMethods
def bar2
'bar2'
end
end
end
class Test
include Foo
end
Test.new.bar1 # => "bar1"
Test.bar2 # => "bar2"
関連
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyのclass << selfイディオム
-
[解決済み】Rubyのメソッドで感嘆符が使われるのはなぜ?
-
[解決済み】Rubyのincludeとextendの違いって何?
-
[解決済み】Rubyモジュールをインクルードせずに、そのインスタンスメソッドを呼び出すことはできますか?
-
[解決済み] なぜsumはinject(:+)よりもずっと速いのですか?
-
[解決済み] Rubyオプションのパラメータ
-
[解決済み] 2つのハッシュを比較するにはどうすればよいですか?
-
[解決済み] 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の文字列の中から"˶‾‾‾˵"を削除するにはどうしたらいいですか?
-
[解決済み] Rubyのsend()は何をするのですか?
-
[解決済み] ruby システムコマンドの終了コードチェック
-
[解決済み] doブロックと中括弧{}の使い分け
-
[解決済み] 変数名を使ったRubyの正規表現
-
[解決済み] ルビー、!オペレーター(a/k/a ダブルバン)[重複]|日本郵船
-
[解決済み] Rubyで2つの配列のマージとインターリーブ
-
[解決済み] メソッド名の最後にある「!」や「?」は何のため?
-
[解決済み] RubyでDateTime.nowをUTCに変換するには?
-
[解決済み] すべての文字と数字の配列を生成する