2014-12-19 2 views
4

У меня есть модуль, который определяет метод, если он еще не определен. Это касается атрибутов ActiveRecord, поскольку их получатели и сеттеры не определены как методы.Ruby `response_to?` Не работает сразу после определения?

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

ответ

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 
+0

wow! в чем разница между 'response_to? 'и' method_defined? '? – brauliobo

+0

получил его, метод определен в экземпляре, так что 'A.new.respond_to?' Работает. Спасибо @kuriouscoder – brauliobo

0

Причина respond_to?(:say_hello) возвращается false связано с тем class A имеет say_hello как метод экземпляра и так как вы расширяете class Bcreate_say_hello_if_not_exists объявляется как метод класса и он не находит say_hello.

Изменение кода на следующий выполнит трюк. Я объявляю say_hello в class A как метод класса и вызываю его статическим образом.

 

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 
Смежные вопросы