Ruby,数组,对象 - 选择对象

4
#!/usr/local/bin/ruby
class OReport
   attr_accessor :id, :name
   def initialize(id, name, desc)
      @id       = id
      @name     = name
      @desc     = desc
   end
end

reports = Array.new
reports << OReport.new(1, 'One', 'One Desc')
reports << OReport.new(2, 'Two', 'Two Desc')
reports << OReport.new(3, 'Three', 'Three Desc')

如何在“报告”中搜索数字“2”,以便从中提取名称和描述?

1
报告 = 报告.select {|r| e.name == 1}.name - trueunlessfalse
1
你漏掉了一个针对description的attr_accessor。 - trueunlessfalse
糟糕,真的,我的选择会引发一个可怕的错误 :) - 抱歉 - trueunlessfalse
3个回答

10
使用find方法,根据条件从集合中获取一个对象:
reports.find { |report| report.id == 2 }
#=> => #<OReport:0x007fa32c9e85c8 @desc="Two Desc", @id=2, @name="Two">

如果您期望有多个对象符合条件,并且想要所有这些对象而不是第一个匹配的对象,请使用select


我喜欢它,但是Wayne的答案更简单,而且一切都基于ID,所以会更快更易于维护。 - WernerCD

4
如果主要使用报告是为了通过id检索,则考虑改用哈希表来进行检索:
reports = {}
reports[1] = OReport.new(1, 'One', 'One Desc')
reports[2] = OReport.new(2, 'Two', 'Two Desc')
reports[3] = OReport.new(3, 'Three', 'Three Desc')

p reports[2].name    # => "Two"

哈希查找通常比数组查找更快,但更重要的是,它更简单。


从未想过使用reports[x]设置。简单易行。 - WernerCD
在这种情况下,是将 OReport 实例中的 @id 删除并在需要引用 id 时使用 reports.key(report) 更好,还是像您的答案中那样保留它? - sawa
@sawa,如果OReport的一个实例需要出于某种目的知道它的ID,则必须保留它。否则,如果需要,ID可以仅作为哈希键保留。 - Wayne Conrad

0

您可以通过以下语法获取2的报告。

reports[1].name
reports[1].id

它肯定会对你有用。


如果它们以不同的顺序添加到数组中会怎样? - Andrew Marshall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接