Mam to pytanie od this discussion. Wywołanie metody, takie jak object.m
, nie zawsze oznacza, że klasa "obiektu" ma metodę "m", tak jak metoda wyszukiwania obiektu Array nie pochodzi bezpośrednio z obiektu Array, lecz z mieszanego modułu Enumerable. Moje pytanie brzmi: w jaki sposób możemy ustalić klasę, z której wywodzi się ta metoda?Jak określić klasę, z której pochodzi określona metoda?
Odpowiedz
Każda metoda klasy/obiektu jest obiektem w języku Ruby i ma kilka własnych metod.
Więc można to zrobić:
[].method(:count).inspect
=> "#<Method: Array#count>"
[].method(:detect).inspect
=> "#<Method: Array(Enumerable)#detect>"
Krótki kawałek RegEx i gotowe.
może użyć dzwoniącego(), aby dać Ci Stolicę backtrace:
myślę coś takiego może pracować
def print_ancestor_definitions(cl,method)
ancestors = cl.ancestors
p ancestors.join(' < ') #Print heirarchy
p "Searching..."
ancestors.each do |c|
if c.instance_methods.include? method
p "#{c} defines #{method} as an instance method!"
elsif c.singleton_methods.include? method
p "#{c} defines #{method} as a singleton method"
else
p "#{c} doesn't define #{method}"
end
end
end
print_ancestor_definitions(Array,'find')
# >> "Array < Enumerable < Object < Kernel"
# >> "Searching..."
# >> "Array defines find as an instance method!"
# >> "Enumerable defines find as an instance method!"
# >> "Object doesn't define find"
# >> "Kernel doesn't define find"
Przypuszczam ostatnia mieć metoda jest tą, która ją definiuje?
Nie jestem pewien, czy możemy dokładnie określić, skąd bierze się metoda, kiedy dodajesz mixin, wszystkie metody stają się częścią twojej klasy, tak jakbyś je tam umieścił. Zobacz odpowiedź od dylanfm na ok.
method.inspect będzie powiedzieć, czy metoda jest dołączona do Mixin –
Odpowiedź Tobyhede jest niesamowita, ale po prostu wykonałem trochę kopania w irb
i nie ma potrzeby zmniejszania wydajności o #inspect
. Method
klasa
>> Object.new.method(:inspect)
=> #<Method: Object(Kernel)#inspect>
ma kilka przydatnych metod własnych:
>> Object.new.method(:inspect).methods - Object.methods
=> ["owner", "call", "to_proc", "unbind", "arity", "receiver", "[]"]
w szczególności metody #owner
, która zwraca właścicielowi jako właściwego obiektu:
>> [].method(:count).owner
=> Array
>> [].method(:detect).owner
=> Enumerable
niesamowite znalezisko, to na pewno się przyda. –
oczywiście! To bardzo fajnie. –
- 1. Jak określić, z której powłoki uniksowej korzystam?
- 2. Jak uzyskać domenę, z której pochodzi żądanie w pliku express.js?
- 3. Jak określić, skąd pochodzi użytkownik w asp.net?
- 4. Metoda wykrywania strony pochodzi z przycisku wstecz.
- 5. Spring Boot - Jak określić alternatywną klasę początkową? (Wiele punktów wejścia)
- 6. Jak określić, z której karty przechodzisz z/do elementu sterującego zakładki WinForm?
- 7. Jak sprawdzić, czy określona metoda klasy została przekazana jako parametr?
- 8. Jak określić ścieżkę, w której zapisuje pliki plik saveAsTable?
- 9. C++ pochodzi z natywnego typu
- 10. Jak sprawdzić, z której aplikacji pochodzi użytkownik po kliknięciu łącza (powiązanej domeny) mojej aplikacji?
- 11. Jak określić, której wersji java użyć w poleceniu spark-submit?
- 12. PHP - jak najlepiej określić, czy bieżące wywołanie pochodzi z interfejsu CLI czy z serwera WWW?
- 13. Jak określić, które moduły zostały połączone w jedną klasę?
- 14. Jak określić ogólną klasę typu dla Swagger odpowiedzi API
- 15. Jak dowiedzieć się w Eclipse, czy określona metoda jest wywoływana z innej metody bezpośrednio lub pośrednio?
- 16. Jak określić klasę kontrolera podany ciąg adresu URL
- 17. Jak określić główną klasę w środowisku wykonawczym w aplikacji Java z gwintem?
- 18. Objective-C HealthKit określić, czy źródło pochodzi z Apple iPhone lub Apple Watch
- 19. Java - Jak dowiedzieć się, z którego pliku Jar pochodzi import?
- 20. Jak sprawdzić, czy NSURLResponse pochodzi z pamięci podręcznej?
- 21. Metoda nadpisania modułu, w której od ... import jest używany
- 22. Jak rozpoznać, z którego katalogu pochodzi importowana biblioteka w pythonie?
- 23. Jak określić przestrzeń nazw funkcji?
- 24. „Określona«@notify_email_operator_name»jest nieprawidłowy” Błąd
- 25. UML metamodel: pochodzi, unia pochodzi i podzbiorów
- 26. Jak stwierdzić, czy klasa pochodzi od innej klasy?
- 27. Jak szybko określić, czy dana metoda zostanie nadpisana w Javie
- 28. Określona obsada jest nieprawidłowa?
- 29. Nie można znaleźć klasy "org.apache.http.entity.mime.content.Filebody", do której odwołuje się metoda
- 30. Grails/Spock: Jak wyśmiewać pojedynczą metodę w klasie, w której metoda jest wywoływana z samej klasy?
Słodkie, to wspaniałe – dylanfm