假设我有一个班级"设施"我有两个例子' Myhome'和' Central'每当创建类的实例时,如何访问/修改实例的属性' Central'示例:
class Facility
attr_accessor :name, :address
def initialize(name,adrs)
@name = name
@address = adrs
end
def some_process
puts "My address #{@address}"
Central.@address = @address + "something"
# I know that this is incorrect usage but
# this is the operation that I would like to perform
end
end
Myhome = Facility.new("Fosters", "B-12 Kensington Farms, Dublin")
Central = Facility.new("Directory", "Not Important")
Myhome.some_process
puts Central.address # This should display the address + "something"
我的目标是访问属性'地址'实例' Central'对于Facility类的每个其他实例,不创建任何新类。
答案 0 :(得分:0)
如安德烈所说,传递实例是推荐的方法。但另一个选择是创建一个类变量(你可以用两个 at 这样的符号来做:@@class_variable_name
)。这将在类的所有实例中更新(有点像全局变量)。
答案 1 :(得分:0)
这里可以采取两种方法:
由于某个特定实例必须保存在某个地方,因此将其存储在类中是有意义的(上面的选项#1)。这既限制了它的范围,也简化了代码。
@ baron816提到了相同的方法,除了他/她提倡使用类变量。类变量的问题在于它们可以在子类中访问。这可能不是问题,但使用类变量而不是类实例变量没有任何优势。
以下是这种方法的实施方式。
class Facility
attr_accessor :name, :address
def initialize(name, address)
@name = name
@address = address
end
def saved_instance_set
self.class.instance_variable_set(:@saved_instance, self)
end
def saved_instance_get
self.class.instance_variable_get(:@saved_instance)
end
def addresses
puts "Address for #{ name } is #{ address }"
puts "Saved instance address is #{ saved_instance_get.address }"
end
end
此类可能如下使用。
my_home = Facility.new("Fosters", "B-12 Kensington Farms, Dublin")
#=> #<Facility:0x...8 @name="Fosters", @address="B-12 Kensington Farms, Dublin">
现在将其设为已保存的实例。
Facility.instance_variables
#=> [] (confirm there are no class instance variables initially)
my_home.saved_instance_set
#=> #<Facility:0x...8 @name="Fosters", @address="B-12 Kensington Farms, Dublin">
Facility.instance_variables
#=> [:@saved_instance] (class instance variable has been created)
现在为鲍勃。
bobs_home = Facility.new("Rikers Island", "Room 253, New York")
#=> #<Facility:0x...8 @name="Rikers Island", @address="Room 253, New York">
为Bob执行addresses
。
bobs_home.addresses
打印
Address for Rikers Island is Room 253, New York
Saved instance address is B-12 Kensington Farms, Dublin