按属性查找对象

时间:2016-10-19 07:52:14

标签: ruby class instance

我有一个像这样的红宝石课:

class Table
  def initialize(name)
    @name = name
    @columns = {}
  end
end

我正在创建不同的对象:

table_1 = Table.new("First")
table_2 = Table.new("Second")
table_3 = Table.new("Third")

如何在Table类的对象中找到具有" Second"的对象?作为name属性?

5 个答案:

答案 0 :(得分:2)

不创建任何其他数据结构:

ObjectSpace.each_object(Table).find { |object| object.instance_variable_get(:@name) == "Second" }
=> #<Table:0x007f9f912b0ce0 @columns={}, @name="Second">

答案 1 :(得分:1)

让我们为name属性添加一个getter方法

class Table
  attr_reader :name

  def initialize(name)
    @name = name
    @columns = {}
  end
end

现在,如果你有一个Table对象数组

arr = [Table.new("First"), Table.new("Second"), Table.new("Third")]

您可以按名称找到

arr.find { |table| table.name == "Second" }
 => #<Table:0x007f862107eb18 @name="Second", @columns={}> 

答案 2 :(得分:1)

您可以使用可枚举模块中的可枚举find或任何类似方法:

class Table
  attr_reader :name
  def initialize(name)
    @name = name
    @columns = {}
  end
end

table_1 = Table.new("First")
table_2 = Table.new("Second")
table_3 = Table.new("Third")

x = [table_1, table_2, table_3].find { |t| t.name == "Second" }

puts x.name => "Second"

答案 3 :(得分:1)

假设我们在name中的Table上有读者:

class Table
  attr_reader :name

  def initialize(name)
    @name = name
    @columns = {}
  end
end

我建议您将这些Table类对象存储在列表/数组中:

table_1 = Table.new("First")
table_2 = Table.new("Second")
table_3 = Table.new("Third")

tables = [table_1, table_2, table_3]

然后可以使用find(如其中一个答案中提到的)或detect来查找它:

tables.detect { |t| t.name == "Second" } #=> table_2 object

如果您想再前进一步,那么我们可以让另一个类维护这个数组:

class TableList
  attr_reader :tables
  def initialize
    @tables = tables
  end

  def add(table)
    @tables << table
  end

  def find_by_name(name)
    tables.detect{ |table| table.name == name }
  end
end

然后可以用作:

table_1 = Table.new("First")
table_2 = Table.new("Second")
table_3 = Table.new("Third")
table_list = TableList.new
table_list.add(table_1)
table_list.add(table_2)
table_list.add(table_3)

table_list.find_by_name('Second') #=> table_2 object

答案 4 :(得分:1)

您可以在类中保留对实例数组的引用。

class Table
  @instances = []
  class << self
    attr_accessor :instances
  end

  def initialize(name)
    @name = name
    @columns = {}
    self.class.instances << self
  end
end

然后你可以通过

获得所有实例
Table.instances

然而,这会阻止所有Table个对象被垃圾收集,所以只有少量的Table只有<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=HWAPI;Integrated Security=SSPI;Connect Timeout=30;User Instance=True" providerName="System.Data.SqlClient" /> 并且这个数量永远不会增长,这是可行的,否则你会有内存泄漏。