Подтвердить что ты не робот

Объект Ruby выводится как указатель

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

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

Что я делаю неправильно? Благодаря

4b9b3361

Ответ 1

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

Ответ 2

Ты не делаешь ничего плохого. Предполагая, что вы видите что-то вроде #<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

Ответ 3

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

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

puts y

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

Ответ 4

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

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