2016-08-16 8 views
1

У меня есть строка кода, который перебирает массив и отвергает любые пустые элементы:Как отфильтровать пустые элементы в массивах

survey.reject!(&:empty?).map! { |feedback| %(_"#{feedback}"_) } 

Если весь массив пуст, это работает, как ожидалось. Если один из элементов массива не пуст, я получаю сообщение об ошибке map! не существует.

Это, однако, не имеет никаких проблем:

survey.map! { |feedback| %(_"#{feedback}_") } 

reject функция работает, когда весь массив пуст, и map! версия работает, когда массив не пуст. Как я могу лучше всего их консолидировать?

ответ

4

Вы должны быть осторожны при использовании модификаторов на месте. Как the documentation for reject! says:

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

Благодаря этой функции вы не можете цеплять их, как вы можете, версии, которые надежно делают копии.

Что вы можете сделать, это сделать его по двум линиям:

survey.reject!(&:empty?) 
survey.map! { |feedback| %(_"#{feedback}"_) } 

Или вы можете цепного Переприсвоить:

survey = survey.reject(&:empty?).map { |feedback| %(_"#{feedback}"_) } 
+0

@you человек, tad. будет принимать как можно скорее. –

+0

Я бы скорее поработал над кодом с привязкой кодов. Я думаю, что я использовал 'reject!' И 'map!' Только несколько раз, но я использовал 'reject' и' map' больше раз, чем могу считать. –

+0

@theTinMan Полностью согласен, хотя мое соотношение больше похоже на 1 раз в 50 раз для версий на месте по сравнению с их копирующими копиями. – tadman

3

Array#reject! возвращается nil, если это ничего не меняет. nil не имеет метода map!, поэтому вы получаете NoMethodError.

Почему вы все равно цепляете за побочные эффекты? Целью побочного эффекта является его побочный эффект, а не его возвращаемое значение. Вы можете просто сделать

survey.reject!(&:empty?) 
survey.map! { |feedback| %(_"#{feedback}"_) } 

Или, еще лучше: не используйте побочные эффекты. Они злы.

survey = survey.reject(&:empty?).map { |feedback| %(_"#{feedback}"_) } 

Заметим, однако, что это делает не делать то же самое, что и выше: вышеупомянутые мутирует единственный объект, который ссылается на survey. Это мутирует ссылку survey и указывает на другой объект.

Это чище в целом, но если в вашей системе есть другой код, который зависит от изменчивого общего состояния и побочных эффектов, его также нужно будет изменить.

+0

Определенно не используйте побочные эффекты. Их использование может быть понятным для человека, написавшего код вначале, но их эффект, скорее всего, не будет очевидным для человека, поддерживающего код. Даже хорошо документированный код, который не является очевидным, может быть проблемой поздно ночью или когда в спешке исправить проблему, связанную с производством. –

Смежные вопросы