如何从对象数组中获取特定对象并在Ruby中同时删除它

时间:2014-02-09 09:51:58

标签: arrays ruby filter

我有一系列卡片类型的sutom对象:

class Card
  attr_accessor :rank, :color
end

我有另一个类'Card's 的类我正在尝试编写一个方法,该方法将Card对象作为参数从数组中取出(如果可用)并将其返回到同时必须从对象数组中删除此对象。 E.g:

array_of_cards = [card1,card2,card3,card4]

def take_card card_to_be_taken
  #here from array_of_cards I have to pick the card
  #that has rank and color the same as 'card_to_be_taken' and 
  #delete it from the array
end

我试过这样:

def take_card a
  to_be_pushed = array.delete_if{|card| (card.rank==a.rank and card.color==a.color)}
end

但to_be_pushed获取的所有卡片数组的值与我要查找的卡片的值不同。

3 个答案:

答案 0 :(得分:3)

我认为你想要的只是Array#delete

a = [ "a", "b", "b", "b", "c" ]
a.delete("b")                   #=> "b"
a                               #=> ["a", "c"]
a.delete("z")                   #=> nil
a.delete("z") { "not found" }   #=> "not found"

特别是如果你想要重复元素的相同行为。

答案 1 :(得分:0)

delete似乎对我有用。您可能需要重载==(如果删除效果不佳,则可以查看)

如果您是ruby pre 2.0,请更改您的initialize,因为我的语法在Ruby 2.0之前无效

class Card
  attr_accessor :rank, :color

  def initialize(rank: nil, color:nil)
    @rank, @color = rank, color
  end

  def ==(card2)
    @rank == card2.rank && @color == card2.color
  end
end

mycards = [ Card.new(rank: 2, color: :red), Card.new(rank: 9, color: :black) ] 

card = mycards.delete( Card.new(rank: 2, color: :red))
puts card
puts mycards.length

返回:

=> #<Card:0x007f8a296ff2d8 @color=:red, @rank=2>
#<Card:0x007f8a296ff2d8>
1

答案 2 :(得分:0)

它与pop类似,但该方法删除了多个参数。

以下是使用delete_if构建它的方法:

在您的代码中:

to_be_pushed = array.delete_if{|card| (card.rank==a.rank and card.color==a.color)}

可以更改为:

ret_value = []
array.delete_if do |card| 
if(card.rank==a.rank and card.color==a.color)
  ret_value << card
  true
end
ret_value

这样你的方法可以返回卡片和卡片。从您的阵列中删除该卡。 PS。我假设你所描述的方法词。