因此,基本上,我正在尝试使同一对象具有不同的实例。我来自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。
要填写max在评论中说的内容:
@@
标记定义了一个类变量(类似于Java的static
)。实例变量由@
符号标识。您的所有对象都具有相同的值,因为它们都共享相同的类变量。
set_type
在大多数情况下看起来都不太像Ruby。 Java的getFoo
约定在Ruby中仅转换为foo
,而从setFoo
转换为foo=
。如
def foo
@foo
end
def foo=(value)
@foo = value
end
此外,obj.foo = bar
是obj.foo=(bar)
的语法糖(使用参数foo=
调用函数bar
),因此代码看起来很自然(即使用setter就像分配变量一样。]]
attr_accessor :foo
将为您同时使用这两种方法。 attr_reader :foo
和attr_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
。