Взять, к примеру, функцию String#=~
. Он вернет индекс первого совпадения, если совпадение найдено, которое, как Fixnum
, всегда будет действовать как true в логических средах. Если совпадение не найдено, возвращается значение null, которое действует как ложное.
Теперь предположим, что у меня есть класс:
class A
attr_accessor :myprop
# prints "I am awesome" if #myprop matches /awesome/
# and "I am not awesome" otherwise
def report_on_awesomeness!
puts "I am #{myprop =~ /awesome/ ? 'awesome' : 'not awesome'}."
end
end
Этот код будет работать почти так же, как и ожидалось, но первый элемент в условном операторе пробной версии - предмет моего вопроса.
Это хорошая идея, чтобы не обернуть myprop =~ /awesome/
? Я не говорю о том, чтобы абстрагировать его в другой метод, такой как def is_awesome?; myprop =~ /awesome/; end
, а о том, предпочтительнее ли мое текущее соглашение, которое заставляет Ruby неявно приводить Fixnums к true, и nils к false, по сравнению с упаковкой условия во что-то, что я сам приводил. Я мог бы легко сделать это:
class A
attr_accessor :myprop
# prints "I am awesome" if #myprop matches /awesome/
# and "I am not awesome" otherwise
def report_on_awesomeness!
puts "I am #{(myprop =~ /awesome/).nil? ? 'not awesome' : 'awesome'}."
end
end
Плюсы, которые я вижу для первого стиля:
- Большинство сопровождающих (включая будущего меня) привыкли к неявному типу
- короче
Плюсы, которые я вижу для второго стиля:
- Более очевидно, какова точная связь между результатом метода
=~
и его логической интерпретацией
- Это дает вам больше свободы в использовании более творческого и явного приведения
Я подозреваю, что может быть какое-то среднее положение, когда вы оставляете неявные преобразования типов в случаях, когда это идиоматично (например, сопоставление регулярного выражения с использованием =~
), и делаете это явно, когда это не так (например, ваши собственные свойства, особенно если они имеют несколько типов возврата).
Буду признателен за любую информацию или опыт сообщества по этому вопросу.