我有一个模块,定义了一个尚未定义的方法。这是ActiveRecord属性的情况,因为他们的getter和setter没有被定义为方法。
module B
def create_say_hello_if_not_exists
puts respond_to?(:say_hello)
define_method :say_hello do
puts 'hello'
end unless respond_to?(:say_hello)
end
end
class A
def say_hello
puts 'hi'
end
puts respond_to?(:say_hello, true)
extend B
create_say_hello_if_not_exists
end
A.new.say_hello
预期结果为hi
,但红宝石打印hello
。为什么呢?
答案 0 :(得分:1)
试试这个。
module B
def create_say_hello_if_not_exists
puts method_defined?(:say_hello)
define_method :say_hello do
puts 'hello'
end unless method_defined?(:say_hello)
end
end
class A
def say_hello
puts 'hi'
end
puts method_defined?( :say_hello )
extend B
create_say_hello_if_not_exists
end
A.new.say_hello
答案 1 :(得分:0)
respond_to?(:say_hello)
返回false
的原因是由于class A
将say_hello
作为实例方法,因为您正在class B
create_say_hello_if_not_exists
say_hello
1}}被声明为类方法,但它找不到say_hello
。
将代码更改为以下内容即可。我在class A
中将{{1}}声明为类方法,并以静态方式调用它。
module B def create_say_hello_if_not_exists puts respond_to?(:say_hello) define_method :say_hello do puts 'hello' end unless respond_to?(:say_hello) end end class A def self.say_hello puts 'hi' end extend B create_say_hello_if_not_exists end A.say_hello