2013-07-27 15 views
6

Edycja: używam Ruby wersję 2.0.0Masz wątpliwości dotyczące "respond_to?" Metoda

Mam następujący kod w pliku example.rb

def say_hello 
    puts 'hi' 
end 

puts respond_to?(:say_hello) 
say_hello 

Po uruchomieniu tego kodu, wyjście:

false 
hi 

Jestem zdezorientowany, dlaczego zwracana jest wartość false dla "respond_to?" kiedy mogę korzystać z tej metody.

"Odpowiedź"? Metoda wydaje się działać w ten sposób choć:

class Person 
    def say_bye 
    puts 'bye' 
    end 
end 

mike = Person.new 
puts mike.respond_to?(:say_bye) 
mike.say_bye 

wyjście jest: „respond_to”

true 
bye 

Czy ktoś ma żadnego wglądu, dlaczego zwraca false w pierwszym przypadku?

+1

ciekawe, wystarczy? uruchomiłem to i zadziałało dla mnie. Czy próbowałeś być bardziej konkretny, nazywając to na własnej skórze? 'puts self.respond_to? (: say_hello)' – AdamT

+0

self.respond_to (: say_hello) zwraca wartość false. – MichaelHajuddah

+0

Jaką wersję Ruby używasz? – Shoe

Odpowiedz

11

metody najwyższego poziomu są zdefiniowane jako prywatne, a Object#respond_to? ignoruje metody domyślnie prywatne (trzeba przejść drugi argument na to, aby rozpoznać say_hello):

def say_hello 
    puts 'hi' 
end 

puts respond_to?(:say_hello)     #=> false 
puts respond_to?(:say_hello, :include_private) #=> true 
say_hello 
+0

Niezupełnie. W Rubim 1.9.3 metody najwyższego poziomu są zdefiniowane jako publiczne. – Shoe

+0

Dzięki za oczyszczenie! Uruchomiłem "puts private_methods.sort" i na pewno, say_hello pojawił się jako metoda prywatna. – MichaelHajuddah

+0

@Jeffrey: Od pytania komentarze: "Używam Ruby 2.0.0" –

3

Ten wziął dużo kopania.

Jak wyjaśniono tutaj, http://marakana.com/bookshelf/ruby_tutorial/scope.html u dołu: "metody zdefiniowane poza dowolną klasą lub modułem stają się metodami prywatnymi w Object i są dostępne wszędzie."

self, na najwyższym poziomie w pliku, to specjalna rzecz o nazwie "main".

Oto zabawna część. Obiekty zaprzeczają, że reagują na prywatne metody.

... druga odpowiedź zawiera pozostałe informacje.

4

W języku Ruby .respond_to? Sposób wyboru dla Ruby, nie Rails który ma respond_to
Staje się symbolem i zwraca prawdziwą jeśli obiekt może otrzymać tę metodę, inny to zwraca fałszywy

Twój pierwszy kod ma brakująca kropka (.) przed odpowiedzią? ... gdy go uruchomiłem wydrukowano: hi, ale nie miałem potwierdzenia prawdziwego stanu. ?

Składnia object.respond_to (: metoda)

->[1,2,3,5,8,13] .respond_to (push)

Powiązane problemy