Рубиновый объект распечатывается как указатель - PullRequest
40 голосов
/ 14 ноября 2011

Я пытаюсь создать класс, у которого есть конструктор, который принимает один аргумент.Когда я создаю новый экземпляр объекта, он возвращает указатель.

class Adder
    def initialize(my_num)
        @my_num = my_num
    end
end
y = Adder.new(12)
puts y

Что я делаю не так?Спасибо

Ответы [ 4 ]

70 голосов
/ 14 ноября 2011

Когда вы используете метод new, вы получаете «ссылку» на вновь созданный объект. puts метод ядра возвращает некоторую внутреннюю информацию ruby ​​об этом объекте. Если вы хотите получить какую-либо информацию о состоянии вашего объекта, вы можете использовать метод 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

Или вы можете использовать метод attr_reader, который определяет пару методов setter и getter позади сцены:

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
15 голосов
/ 14 ноября 2011

Вы не делаете ничего плохого. Предполагая, что вы видите что-то вроде #<Adder:0xb7f9f710 @my_num=12>, тогда в Ruby это просто представление по умолчанию объекта, который вы создали.

Если вы хотите изменить это поведение, чтобы сделать его более дружественным, когда вы передаете свой объект puts, вы можете переопределить метод to_s (to string). например,

class Adder
  def initialize(my_num)
    @my_num = my_num
  end

  def to_s
    "Adder with my_num = #{@my_num}"
  end
end

тогда, когда вы сделаете puts y, вы увидите Adder with my_num = 12

Вы также можете переопределить метод inspect, который используется, например, когда консоль Ruby irb печатает представление вашего объекта, например,

class Adder
  def inspect
    to_s # return same representation as to_s
  end
end

затем в irb:

>> y = Adder.new 12
=> Adder with my_num = 12
4 голосов
/ 14 ноября 2011

Рубин не имеет указателей. В вашем примере y является экземпляром Adder с переменной экземпляра с именем @my_num со значением 12 (которое само является объектом Fixnum).

Метод puts вызывает метод to_s любых аргументов, которые вы передаете ему. Это то, что вы видите на выходе; возможно, вы думаете, что вывод ссылается на указатель, но это просто текстовое представление объекта. Вы можете изменить его, переопределив метод экземпляра to_s для любого класса.

4 голосов
/ 14 ноября 2011

Это потому, что объект является указателем. В Ruby все объекты размещаются в куче, а переменные являются просто ссылками на них.

Когда вы делаете

puts y

На самом деле он вызывает метод объекта по умолчанию to_s, который просто выводит имя класса, место в памяти и некоторую информацию о переменных экземпляра объекта.

...