【问题标题】:Ruby object prints out as pointerRuby 对象打印为指针
【发布时间】:2011-11-14 17:59:54
【问题描述】:

我正在尝试创建一个类,它有一个带有单个参数的构造函数。当我创建对象的新实例时,它会返回一个指针。

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

我做错了什么? 谢谢

【问题讨论】:

    标签: ruby class constructor initialization


    【解决方案1】:

    当您使用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
    

    【讨论】:

    • 在这里使用attr_reader :my_num 比定义你自己的方法来做同样的事情会有好处。
    • 当然可以,但我认为使用一种 getter 方法对于主题启动器会更清晰 :) 确实,我已经更新了我的消息,谢谢
    • 请注意,提到了 attr_reader,然后使用了 attr_accessor。 attr_reader 也可以。它只允许您获取值,而 attr_accessor 还允许您为 my_num 分配一个新值。
    【解决方案2】:

    你没有做错任何事。假设您看到类似 #<Adder:0xb7f9f710 @my_num=12> 的内容,那么在 Ruby 中,这只是您创建的对象的默认表示。

    如果您想在将对象传递给puts 时将此行为更改为更友好,您可以覆盖 to_s(到字符串)方法。例如

    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 没有指针。在您的示例中,yAdder 的一个实例,其实例变量名为 @my_num,其值为 12(它本身就是一个 Fixnum 对象)。

        puts 方法调用您传递给它的任何参数的to_s 方法。这就是你看到的输出;也许你认为输出指的是一个指针,但它只是对象的文本表示。您可以通过覆盖任何类的 to_s 实例方法来更改它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-07
          • 1970-01-01
          • 2019-03-02
          • 2016-03-31
          相关资源
          最近更新 更多