はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
wrap (Python)
前回の記事(module
とclass
間)でホッとしたのですが、module
とmodule
間ですと、NoMethodError
になります。
失敗 (Ruby)
module M
def my_decorator(meth)
orig = method(meth)
define_singleton_method(meth) do |*args, **kwargs|
puts "Calling decorated method"
orig.call(*args, **kwargs)
end
end
end
module A
include M
module_function
def _example
puts "Called decorated method"
end
def example
my_decorator(:_example)
_example
end
end
a = A
a.example
# output
undefined method `define_method'
ぐぬぬ。
成功 (Ruby)
module M
def my_decorator(meth)
orig = method(meth)
define_singleton_method(meth) do |*args, **kwargs|
puts "Calling decorated method"
orig.call(*args, **kwargs)
end
end
end
module A
- include M
+ extend M
module_function
def _example
puts "Called decorated method"
end
def example
my_decorator(:_example)
_example
end
end
a = A
a.example
# output
Calling decorated method
Called decorated method
Module#include は、クラス(のインスタンス)に機能を追加しますが、extend は、ある特定のオブジェクトだけにモジュールの機能を追加したいときに使用します。
ふむふむ、Module
はインスタンスが生成されないのでinclude
では追加されないと理解。
メモ
- Ruby の extend を学習した
- 百里を行く者は九十里を半ばとす