Ruby object prints out as pointer

后端 未结 4 1455
感动是毒
感动是毒 2021-02-02 06:50

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 Adde         


        
相关标签:
4条回答
  • 2021-02-02 07:14

    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
    
    0 讨论(0)
  • 2021-02-02 07:14

    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
    
    0 讨论(0)
  • 2021-02-02 07:34

    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.

    0 讨论(0)
  • 2021-02-02 07:35

    Ruby does not have pointers. In your example, y is an instance of Adder with an instance variable called @my_num with the value of 12 (which is itself a Fixnum object).

    The puts method calls the to_s method of whatever arguments you pass it. That's what you see output; perhaps you think that output refers to a pointer, but it's just a textual representation of the object. You can change it by overriding the to_s instance method for any class.

    0 讨论(0)
提交回复
热议问题