我有一个像这样的红宝石课:
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
属性?
答案 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" />
并且这个数量永远不会增长,这是可行的,否则你会有内存泄漏。