Aqui está um código:
class Person
def initialize(age)
@age = age
end
def age
@age
end
def age_difference_with(other_person)
(self.age - other_person.age).abs
end
protected :age
end
O que eu quero saber é a diferença entre usar @age
e self.age
no age_difference_with
método.
ruby
self
instance-variables
sarunw
fonte
fonte
A diferença é que está isolando o uso do método da implementação. Se a implementação da propriedade mudar, digamos, para manter a data de nascimento e, em seguida, calcular a idade com base na diferença de tempo entre agora e a data de nascimento, o código, dependendo do método, não precisa ser alterado. Se ela usasse a propriedade diretamente, a alteração precisaria se propagar para outras áreas do código. Nesse sentido, o uso direto da propriedade é mais frágil do que a interface fornecida pela classe.
fonte
Esteja avisado quando você herdar uma classe da
Struct.new
qual é uma maneira elegante de gerar um inicializador ( Como gerar o inicializador no Ruby? )retornará
No entanto, quando você remover o inicializador, ele retornará
Com a definição de classe
Você deve fornecer o construtor.
retornará
fonte
A primeira resposta está totalmente correta, mas como um novato relativo, não ficou imediatamente claro para mim o que isso implicava (enviar mensagens para si mesmo? Uh huh ...). Eu acho que um pequeno exemplo ajudará:
fonte
Não há diferença. Suspeito que isso tenha sido feito apenas pelo valor documental de nos vermos
self.age
e nosother_person.age
aproximarmos.Suponho que o uso permita que um getter real seja gravado no futuro, o que pode fazer algo mais complexo do que apenas retornar uma variável de instância e, nesse caso, o método não precisaria ser alterado.
Mas é uma abstração improvável se preocupar, afinal, se a implementação do objeto mudou, é razoável alterar outros métodos, em algum momento uma simples referência dentro do próprio objeto é perfeitamente razoável.
De qualquer forma, a abstração da
age
propriedade ainda não explica o uso explícito deself
, como simplesmenteage
também teria invocado o acessador.fonte
@age - é definitivamente a variável de instância age
self.age - refere-se à idade da propriedade da instância.
fonte