💎メタプログラミングの功罪? Ruby python jsなど
ゴーストメソッドの例をpythonで見せてもらえますか?
ゴーストメソッドとは、プログラミングにおいてあるクラスが持つメソッドが実行時にのみ存在するように動的に作成されるメソッドのことを指します。これは特に Python のような動的な言語でよく使われるテクニックです。Pythonでは __getattr__ マジックメソッドを使用して、ゴーストメソッドを実装することができます。以下にその例を示します。
class GhostMethods:
def __getattr__(self, name):
# ゴーストメソッドを動的に生成
if name.startswith("print_"):
# 実行時に "print_" で始まるメソッドへのアクセスがあった場合、
# 対応する文字列を出力するメソッドを作成する
def method(*args, **kwargs):
print(f"{name[6:]}: {args} {kwargs}")
return method
raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'")
# インスタンス作成
ghost = GhostMethods()
# ゴーストメソッドのテスト
ghost.print_hello("world", end="!") # "hello: ('world',) {'end': '!'}" と出力される
ghost.print_goodbye("everyone") # "goodbye: ('everyone',) {}" と出力される
Rubyで
もとはRubyでいろいろいってたメタプログラミング
香ばしいruby言語のブラックマジック合戦が展開される本かと思ったが、週番で教育係になった先輩からやさしく教えてもらう体裁で、エピソード形式でつかいどころがよくわからなかった。
メタプログラミングは、プログラムが自らの構造や動作を変更・生成する技術を指します。メタプログラミングをサポートする言語では、コードが自身や他のコードについての情報を取得、変更、または生成する能力を持っています。以下は、メタプログラミングの一部の概念についての説明です。
動的ディスパッチ (Dynamic Dispatch):
動的ディスパッチは、実行時にメソッドや関数の呼び出しを決定するテクニックを指します。これは、多くのオブジェクト指向プログラム言語での多態性の実装において重要な役割を果たします。
例えば、JavaやRubyのようなオブジェクト指向言語では、スーパークラスの参照を通じてサブクラスのオブジェクトのメソッドを呼び出す際、実際に実行されるメソッドは実行時に決定されます。
ゴーストメソッド (Ghost Method):
ゴーストメソッドは、明示的に定義されていないメソッドを動的に呼び出すテクニックを指します。Rubyのmethod_missingは、ゴーストメソッドの典型的な例です。
これにより、実行時にメソッド名や呼び出しのパラメータに基づいて動的な振る舞いや応答を生成することが可能となります。
フラットスコープ (Flat Scope):
この用語は、特定の言語や文脈においてさまざまな意味を持つことがありますが、一般的には、ネストされたコードのブロックや関数が、それを包含している外側のスコープの変数や関数にアクセスできることを指します。
RubyのブロックやJavaScriptのクロージャは、フラットスコープの概念を持っている例と言えます。これらの言語のネストされた関数やブロックは、定義された時点の外側のスコープの変数を「キャプチャ」できます。
ゴーストメソッドがRailsで使われているという飲み屋での情報を頼りに買ってしまった。ここに著者本人のコメントもあった
作者の当時のビデオはyoutubeで見つからなかったが本人が話してる姿を見たければ動画がいくつかある。英語は普通にうまい
巻末に魔術書が載っている。最初が配列引数で271ページに説明があるみたいだ。引数自体にイディオムとして意味を持たせるというような意義がある。javascriptでもapplyの引数は配列引数だし、argumentsという配列もある。
Railsの例ではfindの引数の受け渡しで使われていて、横断的にRDBの問い合わせ言語であるSQLを、比較的若いrubyで縦横無尽に書こうとすると、黒魔術的な表現が横行するようだ。
No such method
Proxyを使ってmethod_missingみたいなことはできる
https://note.com/rodz/n/n167bee94e4c7