Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby object prints out as pointer

I'm trying to create a class, which has a constructor that takes a single argument. When I create a new instance of the object, it returns a pointer.

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

What am I doing wrong? Thanks

like image 612
user1043856 Avatar asked Nov 14 '11 17:11

user1043856


3 Answers

When you use new method, you get 'reference' on newly created object. puts kernel method returns some internal ruby information about this object. If you want to get any information about state your object, you can use getter method:

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

Or you can use 'attr_reader' method that define a couple of setter and getter methods behind the scene:

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
like image 121
WarHog Avatar answered Oct 25 '22 07:10

WarHog


You aren't doing anything wrong. Assuming you see something like #<Adder:0xb7f9f710 @my_num=12> then in Ruby this is just the default representation of the object that you've created.

If you want to change this behaviour to be more friendly when you pass your object to puts you can override the to_s (to string) method. e.g.

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

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

then when you do puts y you'll see Adder with my_num = 12

You can also override the inspect method which is what is used, for example, when the Ruby irb console prints the representation of your object e.g.

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

then in irb:

>> y = Adder.new 12
=> Adder with my_num = 12
like image 15
mikej Avatar answered Oct 25 '22 06:10

mikej


That's because the object is a pointer. In Ruby, all objects are allocated on the heap, and the variables are just references to them.

When you do

puts y

It is actually calling the default to_s method of the object, which is just to output the class name, the memory location, and some info on the instance variables of the object.

like image 4
robbrit Avatar answered Oct 25 '22 07:10

robbrit