W Ruby, jak wywołać metodę klasową z jednej z instancji tej klasy? Powiedz, że mam
class Truck
def self.default_make
# Class method.
"mac"
end
def initialize
# Instance method.
Truck.default_make # gets the default via the class's method.
# But: I wish to avoid mentioning Truck. Seems I'm repeating myself.
end
end
linia Truck.default_make
pobiera wartość domyślną. Ale czy można to powiedzieć bez wspominania Truck
? Wygląda na to, że powinno być.
ruby
class-method
Piotr
źródło
źródło
SalesforceSyncJob
krótsza;)self.class
eliminuje potrzebę wyszukiwania / zastępowania, jeśli zdarzy się zmiana nazwy klasy.Używanie
self.class.blah
NIE jest tym samym, co używanie,ClassName.blah
jeśli chodzi o dziedziczenie.źródło
self.class
jest poprawne, aby zachować dziedzictwo. mimo żemake1()
jest zdefiniowany wTruck
, odwołuje się doBigTruck
metody klasy.Aby uzyskać dostęp do metody klasy w metodzie instancji, wykonaj następujące czynności:
Oto alternatywne rozwiązanie problemu:
Teraz skorzystajmy z naszej klasy:
źródło
Jeśli masz dostęp do metody delegowania, możesz to zrobić:
Alternatywnie i prawdopodobnie czystszy, jeśli masz więcej niż jedną lub dwie metody, które chcesz przekazać do klasy i instancji:
Słowo ostrzeżenia:
Nie tylko losowo
delegate
wszystko, co nie zmienia stanu na klasę i instancję, ponieważ zaczniesz napotykać dziwne problemy ze zderzeniami nazw. Zrób to oszczędnie i dopiero po sprawdzeniu nic innego nie zostanie zmiażdżone.źródło
źródło
Robisz to we właściwy sposób. Metody klasowe (podobne do metod „statycznych” w C ++ lub Javie) nie są częścią instancji, więc należy się do nich bezpośrednio odwoływać.
W tym przypadku lepiej byłoby w twoim przykładzie uczynić „default_make” regularną metodą:
Metody klasowe są bardziej przydatne w przypadku funkcji typu narzędziowego, które wykorzystują klasę. Na przykład:
źródło
default_make
powinna to być metoda instancji. Nawet jeśli dla tych przykładów jest to prostsze, nie jest to właściwa semantyka - domyślnie jest produktem klasy, a nie obiektami należącymi do klasy.Jeszcze jeden:
źródło
Oto podejście, w jaki sposób możesz zaimplementować
_class
metodę, która działa jakself.class
w tej sytuacji. Uwaga: nie używaj tego w kodzie produkcyjnym, to ze względu na zainteresowanie :)Od: Czy możesz ewaluować kod w kontekście dzwoniącego w Ruby? a także http://rubychallenger.blogspot.com.au/2011/07/caller-binding.html
Może właściwą odpowiedzią jest przesłanie łatki dla Ruby :)
źródło
Podobnie twoje pytanie, możesz użyć:
źródło