'拒绝!'返回'nil',但它实际上是从数组中删除对象?

时间:2018-04-30 03:58:39

标签: arrays ruby

我有一个哈希@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,但它仍然会删除该对象。我误会了什么吗?如果是这样,是否有其他方法在从数组中删除对象后返回该对象?

2 个答案:

答案 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,你不想在完成任务后继续循环