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 № 1Les 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=()
]