En Ruby, ¿cómo se llama a un método de clase desde una de las instancias de esa clase? Di que tengo
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
la línea Truck.default_make
recupera el valor predeterminado. Pero, ¿hay alguna manera de decir esto sin mencionarlo Truck
? Parece que debería haberlo.
ruby
class-method
Peter
fuente
fuente
SalesforceSyncJob
entonces es más corto;)self.class
elimina la necesidad de buscar / reemplazar si cambia el nombre de la clase.Usar
self.class.blah
NO es lo mismo que usarClassName.blah
cuando se trata de herencia.fuente
self.class
es correcto para preservar la herencia. aunquemake1()
se define enTruck
, hace referenciaBigTruck
al método de clase.Para acceder a un método de clase dentro de un método de instancia, haga lo siguiente:
Aquí hay una solución alternativa para su problema:
Ahora usemos nuestra clase:
fuente
Si tiene acceso al método delegado, puede hacer esto:
Alternativamente, y probablemente más limpio si tiene más de un método o dos que desea delegar a clase e instancia:
Una palabra de precaución:
No solo aleatoriamente
delegate
todo lo que no cambia de estado a clase e instancia, porque comenzará a encontrarse con extraños problemas de choque de nombres. Haga esto con moderación y solo después de que haya verificado nada más se aplasta.fuente
fuente
Lo estás haciendo de la manera correcta. Los métodos de clase (similares a los métodos 'estáticos' en C ++ o Java) no son parte de la instancia, por lo que deben ser referenciados directamente.
En esa nota, en su ejemplo, será mejor que haga que 'default_make' sea un método regular:
Los métodos de clase son más útiles para funciones de tipo de utilidad que usan la clase. Por ejemplo:
fuente
default_make
debería ser un método de instancia. Incluso si es más simple para estos ejemplos, no es la semántica correcta: el valor predeterminado es un producto de la clase, no objetos que pertenecen a la clase.Uno mas:
fuente
Aquí hay un enfoque sobre cómo implementar un
_class
método que funcioneself.class
para esta situación. Nota: No use esto en el código de producción, esto es por interés :)De: ¿Puede evaluar el código en el contexto de una persona que llama en Ruby? y también http://rubychallenger.blogspot.com.au/2011/07/caller-binding.html
Quizás la respuesta correcta sea enviar un parche para Ruby :)
fuente
Similar a su pregunta, podría usar:
fuente