[解決済み】Rubyモジュールをインクルードせずに、そのインスタンスメソッドを呼び出すことはできますか?
2022-04-13 03:28:03
質問
背景
いくつかのインスタンスメソッドを宣言しているモジュールがあります。
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
そして、これらのメソッドのいくつかをクラスの中から呼び出したいのです。通常、rubyでこれを行うには、次のようにします。
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
問題点
include UsefulThings
を持ち込む
すべて
のメソッドのうち
UsefulThings
. この場合、私が欲しいのは
format_text
を必要とせず、明示的に
get_file
と
delete_file
.
これには、いくつかの解決策が考えられますね。
-
メソッドをどこにもインクルードせず、モジュール上で直接呼び出す。
- これがどのように/できるのかわかりません。(それゆえ、この質問)
-
何らかの形で含む
Usefulthings
で、そのメソッドの一部だけを取り込みます。- また、このようなことができるのか、どうすればできるのかわかりません。
-
プロキシクラスを作成し、インクルード
UsefulThings
を作成し、その中でformat_text
をそのプロキシインスタンスに- これならうまくいくのですが、匿名プロキシクラスはハックされます。うっせーよ。
-
モジュールを2つ以上の小さなモジュールに分割する
- この方法も有効で、おそらく私が考えられる最善の解決策なのですが、何十ものモジュールが増殖してしまうので、できれば避けたいところです。
なぜ、一つのモジュールに関係のない機能がたくさんあるのですか?それは
ApplicationHelper
私たちのチームは、他の場所に属するほど特殊でないものの捨て場所として事実上決定した、railsアプリのものです。ほとんどがスタンドアローンのユーティリティメソッドで、どこでも使われるものです。私はそれを別々のヘルパーに分割することができましたが、それらのすべてが1つのメソッドを持つ30があります...これは非生産的であると思われます。
解決方法は?
モジュール上のメソッドがモジュール関数になった場合、Modsからそのメソッドを呼び出すだけで、あたかもそれが
module Mods
def self.foo
puts "Mods.foo(self)"
end
end
以下のmodule_functionのアプローチは、すべてのModsを含むクラスを壊さないようにするものです。
module Mods
def foo
puts "Mods.foo"
end
end
class Includer
include Mods
end
Includer.new.foo
Mods.module_eval do
module_function(:foo)
public :foo
end
Includer.new.foo # this would break without public :foo above
class Thing
def bar
Mods.foo
end
end
Thing.new.bar
しかし、そもそもなぜ無関係な関数のセットが同じモジュールに収まっているのかが不思議です。
編集
の場合にもインクルードが機能することを示すためです。
public :foo
が呼び出された後に
module_function :foo
関連
-
[解決済み】Rubyで数値の配列の合計を出すには?
-
[解決済み] RMagickのインストール。MagickWand.hが見当たりません。
-
[解決済み] あなたが提供した認証メカニズムはサポートされていません。AWS4-HMAC-SHA256を使用してください。
-
[解決済み] gemのインストール中に "permission denied "エラーが発生するのはなぜですか?
-
[解決済み] Ruby Net::HTTPの実行期限が切れた
-
ERRORの問題を解決します。rails のインストール時に gem ネイティブ拡張のビルドに失敗しました。
-
[解決済み] インスタンスメソッドをモンキーパッチする場合、新しい実装からオーバーライドされたメソッドを呼び出すことは可能ですか?
-
[解決済み] ルビーです。インスタンスからクラスメソッドを呼び出す
-
[解決済み】既存のオブジェクトインスタンスにメソッドを追加する
-
[解決済み】Rubyのincludeとextendの違いって何?
最新
-
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で "gets "と "gets.chomp "を使用する方法
-
[解決済み】Ruby:kind_of? vs. instance_of? vs. is_a?
-
[解決済み] Rubyのメソッド'to_sym'は何をするのですか?
-
[解決済み] git, Heroku: pre-receive フックの減少
-
[解決済み] rubyでディレクトリからすべてのファイルを要求する最良の方法?
-
[解決済み] nil から String への暗黙の変換ができないエラー
-
[解決済み] Ruby で Fixnum から String への暗黙の変換ができない (TypeError)
-
[解決済み] 配列に何かを追加しようとしたときに、nil から整数への暗黙の変換が行われない。
-
[解決済み] rvmのインストールがうまくいきません。"RVMは機能ではありません"
-
[解決済み] Rubyで指定されたディレクトリが存在するかどうかを確認する方法