我有一个哈希@log
,其键是一个日期,其值是LogItem
个对象的数组,每个对象都有日期和名称。
我尝试从哈希值中删除一个对象,然后返回删除的对象。我以为reject!
和delete_if
方法会返回它们从数组中删除的对象,并尝试了这个:
def remove_logItem(name, date)
@log[date] #=> {2008-09-12 => "Apple"}
array = @log[date].reject! {|logItem| logItem.name == name}
@log[date] #=> []
array[0].nil? #=> true
return array[0]
end
它返回nil
,但它仍然会删除该对象。我误会了什么吗?如果是这样,是否有其他方法在从数组中删除对象后返回该对象?
答案 0 :(得分:2)
这是documented behaviour for reject!
:
删除块评估为的真
self
的每个元素,如果没有进行任何更改,则返回nil
。
如果您想根据标准分隔对象,可以使用partition
:
@log[date] #=> {2008-09-12 => "Apple"}
removed, @log[date] = @log[date].partition {|logItem| logItem.name == name}
现在,你至少拥有一个空数组。
答案 1 :(得分:0)
你可以循环遍历数组,当循环等于你试图删除和检索的值时,在循环中使用if语句将变量设置为你要删除的变量然后将其删除
继承了一些sudo代码
@foo.each do |hash|
if hash == my_hash_to_delete
my_deleted = my_hash_to_delete
@foo.delete(hash)
break
end
end
编辑:添加了break,你不想在完成任务后继续循环