将实例保存在全局变量中



我需要将对象的所有实例保存在全局变量中,以便我可以从另一个对象访问该实例。没有必要像参数一样传递它们。

在我的解决方案中,我有一个 mixin 和一个将实例放在变量中的方法,我还使用了一种开放类技术将该 mixin 包含在 Object 中,因此其他对象使用该方法(而不仅仅是一个类)。

class Object
    include Favourite
end
module Favourite
    def favourite_it
         #if the variable its not initialized:
         @favourites.class == Array.class ? @favourites.push(self) : 
                                           @favourites = [].push(self)
    end
    def get_favourites
        @favourites
    end
end
 #this class is only an example
class Dog
    def initialize age
        @age = age
    end
end
class Dog_T
    #all instances of this class will be saved in the variable
    def initialize age
        @age = age
        favourite_it
    end
end
class Handler
    def do_something
        #here I need to access the variable with all the instances of favourites to do something to them
    end
end

这是一个简单的测试

handler = Handler.new
d1 = Dog_T.new(10)
d2 = Dog_T.new(12)
all_f = Handler.get_favourites
expect(all_f[0].age).to eq 10
expect(all_f[1].age).to eq 12
d3 = Dog_T.new(15)
all_f = Handler.get_favourites
expect(all_f[3].age).to eq 15

我尝试这样做,但只有每个实例将自己保存在不同的列表中(这是有道理的,因为我还没有使用全局变量)。

我怎样才能只有一个列表,在创建时添加实例,并能够从Handler清空和操作该列表?

Ruby 支持在模块中使用类变量。 您还需要一个读取器方法,以便Dog_T对象能够访问实例变量。 由于 Favorite 不知道有关对象的任何信息,因此您需要使用 respond_to? 来防止调用列表中不存在的方法。 例如,如果有一个 Dog_R 类没有方法age但添加了自身,则在 Favourite 数组的成员上盲目调用 age 方法时会出现运行时错误。

module Favourite
    @@favourites = []          # you can use a class variable in module
    def self.favourite_it(obj) # singleton method of the class
         @@favourites.push(obj)
    end
    def self.get_favourites    # singleton method of the class, see below for usage example
        @@favourites
    end
end
class Object
    include Favourite
end
class Dog
    def initialize age
        @age = age
    end
end
class Dog_T
    attr_reader :age # you need a reader to able to access it
    def initialize age
        @age = age
        Favourite.favourite_it(self)
    end
end
d1 = Dog_T.new(10)
d2 = Dog_T.new(12)
all_f = Favourite.get_favourites
all_f.each do |obj|
    puts "#{obj.class}: #{obj.age if obj.respond_to?(:age)}"
end
puts '-' * 20
d3 = Dog_T.new(15)
all_f = Favourite.get_favourites
all_f.each do |obj|
    puts "#{obj.class}: #{obj.age if obj.respond_to?(:age)}"
end

该程序的输出是:

Dog_T: 10
Dog_T: 12
--------------------
Dog_T: 10
Dog_T: 12
Dog_T: 15

相关内容

  • 没有找到相关文章

最新更新