Объект Ruby выводится как указатель
Я пытаюсь создать класс, у которого есть конструктор, который принимает один аргумент. Когда я создаю новый экземпляр объекта, он возвращает указатель.
class Adder
def initialize(my_num)
@my_num = my_num
end
end
y = Adder.new(12)
puts y
Что я делаю неправильно?
Благодаря
Ответы
Ответ 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
для любого класса.