web-dev-qa-db-fra.com

Ruby objet s'imprime comme 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

40
user1043856

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
70
WarHog

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
15
mikej

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.

4
robbrit

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.

4
coreyward