0

我有两个班级:ItemItemCollectionItem有几个属性:attr1attr2attr3等,并ItemCollection包含一个实例数组Item,以及一些操作方法。

问题 1:这是处理对象集合的适当方式吗?

我想要一个方法: ,它为实例数组中的某个项目ItemCollection#itemExists(needleItem)返回trueif 。needleItem.attr1 == attr1ItemCollection

问题2:最好的方法是什么?

4

4 回答 4

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

我想 needleitem 在数组中?如果是这样,c 的任何大于 1 的计数都应该没问题。如果不是,则 c 的任何大于 0 的计数都应满足。再加上你得到总数。

-道格拉斯

于 2013-01-26T09:40:32.367 回答
1

问题 1:这是处理对象集合的适当方式吗?

您可以从中派生您的ItemCollectionArray并免费获取其方法。

问题2:最好的方法是什么?

我看到两个选项(假设您遵循我之前的建议):

  1. 使用简单迭代的覆盖include?方法:ItemCollectioneach

    class ItemCollection < Array
      def include?(item)
        self.each do |i|
          return true if i.attr1 == item.attr1
        end
        return false
      end
    end
    
  2. 为实例提供您自己的相等性测试并使用源自( s with equal 的Item默认版本将始终被视为相等):include?ArrayItemattr1

    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
    
于 2013-01-26T09:52:49.167 回答
1

如果 ItemCollection 只保存数组和一些方法(没有其他相关数据)——那么就真的不需要那个额外的类了。只需使用数组并将方法定义为简单函数即可。

至于搜索数组——道格拉斯的答案可能是最好的。但是,另一种方法(可能效率较低)是使用从数组中的对象中Array#map提取attr1,然后array#include?搜索所需的值。例如

 collectionArray.map(&:attr1).include?(attr_to_find)

语法等价于&:attr1{ |x| x.attr1 }

并用于将对象数组映射到仅包含所需属性的数组。

于 2013-01-26T09:59:26.213 回答
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>]
于 2013-01-26T16:08:45.457 回答