"Отвергнуть! возвращает 'nil', но он на самом деле удаляет объект из массива? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть хеш @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 голосов
/ 30 апреля 2018

вы можете зациклить массив, и когда цикл равен значению, которое вы пытаетесь удалить и извлечь, используйте оператор if внутри цикла, чтобы установить переменную, равную той, которую вы хотите удалить, а затем удалить ее

вот какой-то код sudo

@foo.each do |hash| 
 if hash == my_hash_to_delete
  my_deleted = my_hash_to_delete
  @foo.delete(hash)
  break
 end
end

edit: добавлен перерыв, вы не хотите продолжать цикл после завершения задачи

0 голосов
/ 30 апреля 2018

Это задокументированное поведение для reject!:

Удаляет каждый элемент self, для которого блок имеет значение true, если не было внесено никаких изменений, возвращает nil.

Если вы хотите разделить объекты на основе критериев, которые вы можете использовать partition:

@log[date] #=> {2008-09-12 => "Apple"}
removed, @log[date] = @log[date].partition {|logItem| logItem.name == name}

Где теперь у вас есть, по крайней мере, пустой массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...