2014-02-21 4 views
1

У меня есть класс (BaseClass) и подкласс (SubClass), который наследуется от BaseClass. Одна из операций, которые я хочу выполнить, - это отправлять запросы из базы в Sub, но только если для нее определен метод. Позвольте мне продемонстрировать это с некоторым кодом:проверить, существует ли метод в подклассе

BaseClass:

def extract_data extracted_data=Hash.new 
    ['attr1','attr2','attr3'].each do |attr| 
    extracted_data[attr] = self.send("extract_#{attr}") 
    end 
    return extracted_data 
end 

Подкласс:

def extract_attr1 
    # do something and return a value 
end 

Это работает втирают хорошо, если есть метод с таким именем в определенный в Подкласс. Если он не определен, я получу ошибку. Как проверить, что метод определен в подклассе перед его вызовом?

ответ

6

Просто напишите, как показано ниже, используя Object#respond_to?

extracted_data[attr] = self.send("extract_#{attr}") if self.respond_to?("extract_#{attr}") 
+2

Некоторые программисты на Ruby не нравится метод '#respond_to?', Так как его некоторые применения являются признаком * куриной набрав *. В этом конкретном случае, '#respond_to?' Мне нравится, но некоторые могут предпочесть обработку исключений NoMethodError'. –

+0

@BorisStitnicky Вы подразумеваете 'self.send (" extract _ # {attr} ") rescue NoMethodError'. BTW, что такое * цыпленок, набирающий *? –

+0

Вкратце: 'do_something(), если self.respond_to ('some_possible_function')' – Eddie

Смежные вопросы