Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby对象打印为指针_Ruby_Class_Constructor_Initialization - Fatal编程技术网

Ruby对象打印为指针

Ruby对象打印为指针,ruby,class,constructor,initialization,Ruby,Class,Constructor,Initialization,我试图创建一个类,它有一个接受单个参数的构造函数。当我创建对象的新实例时,它返回一个指针 class Adder def initialize(my_num) @my_num = my_num end end y = Adder.new(12) puts y 我做错了什么? 谢谢,那是因为对象是指针。在Ruby中,所有对象都分配在堆上,变量只是对它们的引用 当你这样做的时候 puts y 它实际上是调用对象的默认方法,只输出类名、内存位置和有关对象实例变量的一

我试图创建一个类,它有一个接受单个参数的构造函数。当我创建对象的新实例时,它返回一个指针

class Adder
    def initialize(my_num)
        @my_num = my_num
    end
end
y = Adder.new(12)
puts y
我做错了什么? 谢谢,那是因为对象是指针。在Ruby中,所有对象都分配在堆上,变量只是对它们的引用

当你这样做的时候

puts y

它实际上是调用对象的默认方法,只输出类名、内存位置和有关对象实例变量的一些信息。

Ruby没有指针。在您的示例中,
y
Adder
的一个实例,其实例变量名为
@my_num
,其值为
12
(其本身是
Fixnum
对象)


put
方法调用
to\u s
方法来传递任何参数。这就是你看到的输出;也许您认为输出引用了指针,但它只是对象的文本表示。您可以通过为任何类重写
到_s
实例方法来更改它。

您没有做错任何事情。假设您看到类似于
#
的内容,那么在Ruby中,这只是您创建的对象的默认表示形式

如果要在将对象传递到
put
时将此行为更改为更友好的行为,可以重写to_s(to string)方法。e、 g

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

  def to_s
    "Adder with my_num = #{@my_num}"
  end
end
然后,当您执行
放置y
时,您将看到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

当您使用
new
方法时,您将在新创建的对象上获得“引用”
put
kernel方法返回有关此对象的一些内部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\u reader:my\u num
而不是定义自己的方法,这将是有益的。当然,但我认为使用一个getter方法对于主题启动者来说会更清楚:)事实上,我已经更新了我的消息,感谢您提到了attr\u reader,然后使用了attr\u访问器。attr_reader也可以工作。它只允许您获取值,而attr_accessor还允许您为my_num分配一个新值。