【问题标题】:How can I insert an object in an array of objects in ruby?如何在 ruby​​ 的对象数组中插入一个对象?
【发布时间】:2019-12-04 11:32:08
【问题描述】:

我需要在数组中打印 uniq 结果。为了测试这一点,我需要在我的数组中插入一个对象。

array = [#<Card id: 394034, cards_config_id: nil>, #<Card id: 394033, cards_config_id: nil>,#<Card id: 394032, cards_config_id: nil>, #<Card id: 394035, cards_config_id: nil>]

我需要插入另一个Card 对象来测试唯一性。 像这样array.uniq &amp;:id

我知道这是错误的,但我怎样才能做到这一点?

array &lt;&lt; Card id:394034, cards_config_id: nil&gt;

【问题讨论】:

  • 如果您想测试数组arr 的所有元素是否唯一,则只需arr == arr.uniq。为什么要在数组中插入元素?请更清楚地了解您想要的结果,而不是您假设为实现该结果需要做的事情。
  • @CarySwoveland 我知道uniq 会起作用,但我需要在有物体的情况下对其进行测试。 array.uniq &amp;:id 是否可行。我还需要添加测试用例。
  • 您的问题不清楚。此外,您的 array 不是有效的 Ruby 代码。请出示明确代表您遇到的实际问题的minimal reproducible example。

标签: arrays ruby object testing insert


【解决方案1】:

你可以简单地做如下,

array = [#<Card id: 394034, cards_config_id: nil>, #<Card id: 394033, cards_config_id: nil>,#<Card id: 394032, cards_config_id: nil>, #<Card id: 394035, cards_config_id: nil>]


array = array | [#<Card id: 394034, cards_config_id: nil>]

你也可以使用Set

require 'set'

set = Set[#<Card id: 394034, cards_config_id: nil>, #<Card id: 394033, cards_config_id: nil>,#<Card id: 394032, cards_config_id: nil>, #<Card id: 394035, cards_config_id: nil>]

set.add(#<Card id: 394034, cards_config_id: nil>)

作为set不允许有重复

【讨论】:

  • 这两种方法我仍然遇到语法错误。 array = array | [#&lt;Card id:123, cards_config_id: nil&gt;]SyntaxError Exception: (byebug):1: syntax error, unexpected end-of-input, expecting ']' ... id:123, cards_config_id: nil&gt;]
  • 你可以拥有它,array = array | Card.find(123)
【解决方案2】:

也许你也可以这样验证。

class Card
   attr_accessor :id, :cards_config_id
   def initialize(id, cards_config_id = nil)
       @id = id
       @cards_config_id = cards_config_id
   end
end

>many_card = Array.new(2){Card.new(394034)}
=> [#<Card:0x5dd6264 @cards_config_id=nil, @id=394034>, #<Card:0x1ffe63b9 @cards_config_id=nil, @id=394034>]

>  many_card.uniq{|x| x.id}
=> [#<Card:0x5dd6264 @cards_config_id=nil, @id=394034>]

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    这对我有用。

    array = [#<Card id: 394034, cards_config_id: nil>, #<Card id: 394033, cards_config_id: nil>,#<Card id: 394032, cards_config_id: nil>, #<Card id: 394035, cards_config_id: nil>]
    
    array << Card.find(123)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多