创建一个对象的多个实例时,将它们视为内存中的同一对象

问题描述 投票:0回答:1

因此,基本上,我正在尝试使同一对象具有不同的实例。我来自Java,在Java中,您只需使用new关键字就可以了。我尝试了“ Digit.new”,并且该对象的最后一个分配实例更改了该对象的所有实例

我尝试使用“ self”关键字,但是它只是使我的程序崩溃。

n_one = Digit.new
n_two = Digit.new
n_three = Digit.new
n_four = Digit.new
am_pm = Digit.new

.
.
.
n_three.set_type 3

n_four.set_type 1

class Digit
  @@type = nil

  #This will determine what strings will be returned
  def set_type num
    @@type = num
  end
end

预期的是n_three的类型是3,n_four的类型是1。但是n_one,2、3和4都是1。

ruby
1个回答
1
投票

要填写max在评论中说的内容:

@@标记定义了一个类变量(类似于Java的static)。实例变量由@符号标识。您的所有对象都具有相同的值,因为它们都共享相同的类变量。

set_type在大多​​数情况下看起来都不太像Ruby。 Java的getFoo约定在Ruby中仅转换为foo,而从setFoo转换为foo=。如

def foo
  @foo
end

def foo=(value)
  @foo = value
end

此外,obj.foo = barobj.foo=(bar)的语法糖(使用参数foo=调用函数bar),因此代码看起来很自然(即使用setter就像分配变量一样。]]

attr_accessor :foo将为您同时使用这两种方法。 attr_reader :fooattr_writer :foo仅构成吸气剂或设定器方法。因此,您的代码可以写为

class Digit
  attr_writer :type
end

n_three = Digit.new
n_three.type = 3

与…相同

class Digit
  def type=(value)
    @type = value
  end
end

n_three = Digit.new
n_three.type=(3)

当然,如果您想读取

n_three.type,则还需要定义一个吸气剂(或在第一个代码片段中将attr_writer替换为attr_accessor)。请注意,您也不需要将@type初始化为nil,因为它是未初始化的实例变量的默认值。但是您可以使用initialize方法对其进行初始化。

Java合并构造函数和初始化程序;在Ruby中,构造函数为::new(我们通常调用该类方法来创建新对象,几乎不需要重写它)。初始化程序为#initialize(由默认构造函数自动调用)。您无法像在Java中那样在方法之外初始化实例变量。因此,初始化实例变量的正确方法是:

class Digit
  attr_writer :type

  def initialize(type)
    @type = type
  end
end

如果定义了设置器,则可以(并且应该应该)使用self.type = type而不是@type = type

© www.soinside.com 2019 - 2024. All rights reserved.