No Ruby, como você chama um método de classe de uma das instâncias dessa classe? Diga que eu tenho
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
a linha Truck.default_make
recupera o padrão. Mas existe uma maneira de dizer isso sem mencionar Truck
? Parece que deveria haver.
ruby
class-method
Pedro
fonte
fonte
SalesforceSyncJob
, então é mais curto;)self.class
elimina a necessidade de pesquisa / substituição se você renomear a classe.Usar
self.class.blah
NÃO é o mesmo que usarClassName.blah
quando se trata de herança.fonte
self.class
está correto para preservar a herança. mesmo quemake1()
definido emTruck
, é oBigTruck
método de classe de referência .Para acessar um método de classe dentro de um método de instância, faça o seguinte:
Aqui está uma solução alternativa para o seu problema:
Agora vamos usar nossa classe:
fonte
Se você tiver acesso ao método delegado, poderá fazer o seguinte:
Como alternativa, e provavelmente mais limpo, se você tiver mais de um método ou dois que deseja delegar para a classe e instância:
Uma palavra de cautela:
Não basta aleatoriamente
delegate
tudo o que não muda de estado para classe e instância, porque você começará a encontrar problemas estranhos de conflito de nome. Faça isso com moderação e somente depois de verificar nada mais é esmagado.fonte
fonte
Você está fazendo isso da maneira certa. Os métodos de classe (semelhantes aos métodos 'estáticos' em C ++ ou Java) não fazem parte da instância, portanto, precisam ser referenciados diretamente.
Nessa nota, em seu exemplo, seria melhor fazer com que 'default_make' seja um método regular:
Os métodos de classe são mais úteis para funções do tipo utilitário que usam a classe. Por exemplo:
fonte
default_make
deveria ser um método de instância. Mesmo que seja mais simples para esses exemplos, não é a semântica correta - o padrão é um produto da classe, não objetos que pertencem à classe.Mais um:
fonte
Aqui está uma abordagem sobre como você pode implementar um
_class
método que funciona comoself.class
para esta situação. Nota: Não use isso no código de produção, isso é pelo interesse :)De: Você pode avaliar o código no contexto de um chamador em Ruby? e também http://rubychallenger.blogspot.com.au/2011/07/caller-binding.html
Talvez a resposta certa seja enviar um patch para Ruby :)
fonte
Semelhante à sua pergunta, você pode usar:
fonte