我正在使用 Ruby 1.9.2 和 Ruby on Rails v3.2.2 gem。我正在尝试以“正确的方式”学习元编程,此时我正在为 RoR 模块提供的块中的实例方法起别名:included do ... end
ActiveSupport::Concern
module MyModule
extend ActiveSupport::Concern
included do
# Builds the instance method name.
my_method_name = build_method_name.to_sym # => :my_method
# Defines the :my_method instance method in the including class of MyModule.
define_singleton_method(my_method_name) do |*args|
# ...
end
# Aliases the :my_method instance method in the including class of MyModule.
singleton_class = class << self; self end
singleton_class.send(:alias_method, :my_new_method, my_method_name)
end
end
“新手”说,通过在 Web 上的搜索,我想出了该singleton_class = class << self; self end
语句,并使用它(而不是class << self ... end
块)来限定变量的范围,my_method_name
从而动态生成别名。
我想确切了解上述代码中的工作原理和singleton_class
方式,以及是否有更好的方法(也许是更易于维护和性能更好的方法)来实现相同的方法(别名、定义单例方法等),但是“正确的方式”,因为我认为并非如此。