我有两个课程:Item
和ItemCollection
。 Item
有几个属性:attr1
,attr2
,attr3
等,而ItemCollection
包含Item
个实例的数组,还有一些操纵方法。
问题1:这是处理对象集合的适当方法吗?
我想要一个方法:ItemCollection#itemExists(needleItem)
,如果对true
个实例的数组中的某个项needleItem.attr1 == attr1
返回ItemCollection
。
问题2:最好的方法是什么?
答案 0 :(得分:1)
看起来你可以算数。 http://ruby-doc.org/core-1.9.3/Array.html#method-i-count
简单的代码是:
def check_needle
c = ItemCollection.count { |i|
needleitem.attr1 == i.attr1 # Each time this value returns true it enumerates
}
c > 1
# or
if c > 1 then return true end
end
我想针线在阵列中?如果是这样,c的任何大于1的计数应该没问题。如果不是,c的任何大于0的计数都应该满足。另外,你得到总数。
-Douglas
答案 1 :(得分:1)
问题1:这是处理对象集合的合适方法吗?
您可以从ItemCollection
派生Array
课程并免费获取其方法。
问题2:最好的方法是什么?
我看到两个选项(假设您遵循我之前的建议):
使用include?
的简单迭代覆盖ItemCollection
中的each
方法:
class ItemCollection < Array
def include?(item)
self.each do |i|
return true if i.attr1 == item.attr1
end
return false
end
end
为Item
个实例提供您自己的相等测试,并使用从include?
派生的默认Array
版本(Item
s,等于attr1
将始终被视为平等):
class Item
def initialize(attr1, attr2, attr3)
@attr1, @attr2, @attr3 = attr1, attr2, attr3
end
attr_accessor :attr1, :attr2, :attr3
def ==(another)
self.attr1 == another.attr1
end
end
答案 2 :(得分:1)
如果ItemCollection只保存数组和一些方法(而没有其他相关数据) - 那么实际上不需要额外的类。只需使用数组并将方法定义为简单函数。
至于搜索阵列 - 道格拉斯答案可能是最好的。但是,另一种方法(可能效率较低)是使用Array#map
从数组中的对象中提取attr1
,然后array#include?
来搜索所需的值。例如。
collectionArray.map(&:attr1).include?(attr_to_find)
&:attr1
语法相当于
{| x | x.attr1}
用于将对象数组映射到仅包含所需属性的数组中。
答案 3 :(得分:0)
ruby数组实例有100多个方法,不包括Object。其中许多都非常灵活。 any?
方法(包含在enumerable中)采用一个块,允许您指定应该返回true的条件。
class Item < Struct.new(:attr1, :attr2)
end
p item_collection = Array.new(10){|n| Item.new(rand(10), n)}
#[#<struct Item attr1=7, attr2=0>, #<struct Item attr1=5, attr2=1>,
#<struct Item attr1=8, attr2=2>, #<struct Item attr1=3, attr2=3>,
#<struct Item attr1=9, attr2=4>, #<struct Item attr1=8, attr2=5>,
#<struct Item attr1=1, attr2=6>, #<struct Item attr1=6, attr2=7>,
#<struct Item attr1=4, attr2=8>, #<struct Item attr1=6, attr2=9>]
p item_collection.any?{|i| i.attr1 == 3}
#true
当item_collection有一个非常特殊的方法时,可能是在item_collection数组上定义它:
def item_collection.very_special_method
self.select{|i| i.attr1 == i.attr2}
end
p item_collection.very_special_method
# [#<struct Item attr1=3, attr2=3>]