И цепь не работает должным образом

Я пытаюсь реорганизовать этот мой код:

test_cases.select{ |x| x.script && x.script.versions && !x.script.versions.empty? }

и использовать драгоценный камень andand. Базовое использование просто говорит нам, что мы подставляем andand к &&(то есть к имени), поэтому я попробовал это:

test_cases.select{ |x| !x.andand.script.andand.script_versions.andand.empty? }

но, похоже, это НЕ целое утверждение (я только что понял это сейчас, когда писал вопрос)

Значит ли это, что я должен отделить пустое? статья? Есть ли функция andand, которая проверяет нет (но только последняя?)

3 ответа

Решение

Я фактически использовал это предложение, и оно работает:

test_cases.map{ |x| x.script.andand.versions && !x.script.versions.empty? }.none?

только один andand вызов и используемая карта вместо выбора

Вы всегда можете сделать

test_cases.select{ |x| x.andand.script.andand.script_version } unless x.empty?

По теме andandВ то время как мы используем его в нашем проекте, и в целом мне это нравится, я обнаружил, что ложное использование andand может скрыть проблемы, которые должны быть надлежащим образом решены. Как и многие хорошие инструменты, его следует использовать с осторожностью.

Когда x не является nil это работает хорошо, я думаю. Проблема в том, когда x является nil так как ...empty? возвращается также nil, а также !nil -> true, Тогда это x неправильно выбран. Я бы предложил явную проверку логического значения:

 test_cases.select { |x| x.andand.script.andand.versions.andand.empty? == false }

Или, возможно, лучше использовать пробел / подарок без последнего andand:

 test_cases.select { |x| x.andand.script.andand.versions.present? }
 test_cases.reject { |x| x.andand.script.andand.versions.blank? }

Примечание: это не связано с проблемой здесь, но я предпочитаю, чтобы Ик, возможно, закончился, и, как только nil рассматривается как "пустота" (false это законное значение, которое, я думаю, не должно быть прокси).

Другие вопросы по тегам