40 votes

L'objet Ruby s'affiche comme un pointeur

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

70voto

WarHog Points 5406

Lorsque vous utilisez new vous obtenez une "référence" sur l'objet nouvellement créé. puts La méthode kernel renvoie quelques informations internes de ruby sur cet objet. Si vous voulez 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

Vous pouvez également utiliser la méthode "attr_reader" qui définit un couple de méthodes setter et getter derrière la scène :

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

15voto

mikej Points 30224

Vous ne faites rien de mal. En supposant que vous voyez quelque chose comme #<Adder:0xb7f9f710 @my_num=12> alors en Ruby, c'est juste la représentation par défaut de l'objet que vous avez créé.

Si vous souhaitez modifier ce comportement pour qu'il soit plus convivial lorsque vous passez votre objet à l'adresse suivante puts vous pouvez surcharger 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 le faites puts y vous verrez Adder with my_num = 12

Vous pouvez également remplacer l'option inspect qui est utilisée, par exemple, lorsque la console Ruby irb imprime la représentation de votre objet, par exemple.

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

4voto

robbrit Points 7531

C'est parce que l'objet est un pointeur. En Ruby, tous les objets sont alloués sur le tas, et les variables ne sont que des références à ces objets.

Quand vous le faites

puts y

Il appelle en fait la méthode to_s par défaut de l'objet, qui ne fait qu'afficher le nom de la classe, l'emplacement mémoire et quelques informations sur les variables d'instance de l'objet.

4voto

coreyward Points 26109

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 Fixnum objet).

Le site puts appelle la méthode to_s de tous les arguments que vous lui passez. C'est ce que vous voyez en sortie ; peut-être pensez-vous que la sortie fait référence à un pointeur, mais c'est juste une représentation textuelle de l'objet. Vous pouvez la modifier en surchargeant la méthode to_s méthode d'instance pour toute classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X