从Ruby中的同一个类定义中访问类实例的属性

时间:2016-10-18 16:26:08

标签: ruby class

假设我有一个班级"设施"我有两个例子' 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类的每个其他实例,不创建任何新类。

2 个答案:

答案 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