J'essaie de créer une classe, qui a un constructeur qui prend un seul argument. Lorsque je crée une nouvelle instance de l'objet, il renvoie un pointeur.
class Adder
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y
Qu'est-ce que je fais mal? Merci
Lorsque vous utilisez la méthode new
, vous obtenez "référence" sur l'objet nouvellement créé. puts
la méthode du noyau renvoie des informations internes Ruby sur cet objet. Si vous souhaitez obtenir des informations sur l'état de votre objet, vous pouvez utiliser la méthode getter:
class Adder
def initialize(my_num)
@my_num = my_num
end
def my_num
@my_num
end
end
y = Adder.new(12)
puts y.my_num # => 12
Ou vous pouvez utiliser la méthode "attr_reader" qui définit quelques méthodes de définition et de lecture en arrière-plan:
class Adder
attr_accessor :my_num
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y.my_num # => 12
Vous ne faites rien de mal. En supposant que vous voyez quelque chose comme #<Adder:0xb7f9f710 @my_num=12>
puis dans Ruby c'est juste la représentation par défaut de l'objet que vous avez créé.
Si vous souhaitez modifier ce comportement pour être plus convivial lorsque vous passez votre objet à puts
, vous pouvez remplacer la méthode to_s (to string). par exemple.
class Adder
def initialize(my_num)
@my_num = my_num
end
def to_s
"Adder with my_num = #{@my_num}"
end
end
alors quand vous faites puts y
tu verras Adder with my_num = 12
Vous pouvez également remplacer la méthode inspect
qui est utilisée, par exemple, lorsque la console Ruby irb imprime la représentation de votre objet, par ex.
class Adder
def inspect
to_s # return same representation as to_s
end
end
puis en irb:
>> y = Adder.new 12
=> Adder with my_num = 12
C'est parce que l'objet est un pointeur. Dans Ruby, tous les objets sont alloués sur le tas et les variables ne sont que des références à eux.
Quand tu fais
puts y
Il appelle en fait la méthode to_s par défaut de l'objet, qui consiste simplement à afficher le nom de la classe, l'emplacement de la mémoire et quelques informations sur les variables d'instance de l'objet.
Ruby n'a pas de pointeurs. Dans votre exemple, y
est une instance de Adder
avec une variable d'instance appelée @my_num
avec la valeur de 12
(qui est lui-même un objet Fixnum
).
La méthode puts
appelle le to_s
méthode de tous les arguments que vous lui transmettez. C'est ce que vous voyez en sortie; vous pensez peut-être que la sortie fait référence à un pointeur, mais ce n'est qu'une représentation textuelle de l'objet. Vous pouvez le modifier en remplaçant le to_s
méthode d'instance pour n'importe quelle classe.