我有一系列卡片类型的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获取的所有卡片数组的值与我要查找的卡片的值不同。
答案 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。我假设你所描述的方法词。