Ruby的`respond_to?`在定义后不起作用?

时间:2014-12-19 21:39:50

标签: ruby

我有一个模块,定义了一个尚未定义的方法。这是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。为什么呢?

可能与Confused about "respond_to?" method

有关

2 个答案:

答案 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 Asay_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