/ / Ruby accédant à la variable d'instance d'un autre objet - ruby

Ruby accédant à la variable d'instance d'un autre objet - ruby

Je "nage avec Ruby (Ruby 1.9.3, IRB 0.9.6 (09/06/30)) et je" essaie de développer une classe de nombres complexe. J'ai le initialize et to_s les méthodes fonctionnent bien. J'essaie maintenant de surcharger les quatre opérateurs arithmétiques.

Ce que j'ai eu est le suivant:

def +(other)
return ComplexNumber.new(@real + other.@real, @imag + other.@imag)
end

mais pour une raison quelconque, il n'a pas aimé other.@real; ça dit

erreur de syntaxe: tIVAR inattendu

et pointe vers la virgule après other.@real.

Alors je l'ai changé pour:

def get_values
return [@real, @imag]
end

def +(other)
other_values = other.get_values
return ComplexNumber.new(@real + other_values[0], @imag + other_values[1])
end

Bien que cela fonctionne, j’ai le sentiment que ce n’est pas la bonne façon de le faire. Je ne veux pas vraiment exposer les get_values méthode; n’est-il pas possible d’accéder à une variable d’une autre instance de la même classe?

Réponses:

1 pour la réponse № 1

Les variables d’instance sont accessibles sans le @ en se référant à une autre instance:

other.real

(En supposant que vous utilisiez soit attr_accessor pour les définir, ou fournissent vos propres accesseurs. Même au sein de la même instance, vous préférerez peut-être utiliser les accesseurs au cas où la logique irait au-delà du simple retour de la variable d’instance.)


3 pour la réponse № 2

La meilleure façon (à mon avis) serait de fournir un accès en lecture seule aux variables real et imag en utilisant attr_reader. Comme:

class ComplexNumber
attr_reader :imag, :real
...
def +(other)
return ComplexNumber.new(@real + other.real, @imag + other.imag)
end
end

Notez que attr_reader définit les méthodes en votre nom. .real() et .imag() [attr_accessor définit en outre .real=() et .image=()]