В рубине, правда лидиоматично для имени метода, заканчивающегося вопросительным знаком?
Нормально ли для методов с вопросительным знаком возвращать что-то истинное (например, число), чтобы указать, что что-то истинно, или нужно вернуть true
?
Есть ли примеры правды, которые используются в стандартной библиотеке Ruby или Rails, например?
Фон: Кто-то написал метод String#int?
в ответе на отдельный вопрос, в котором было возвращено целое число для представления true и nil
для представления false. Другой пользователь был удивлен тем, что не возвращал логическое значение.
Ответы
Ответ 1
Обычно для методов, заканчивающихся на ?
, возвращает либо true
, либо false
, но он не является систематическим, и никакой основной метод не примет его.
Примером в основных классах является Numeric#nonzero?
, который никогда не возвращает true
или false
.
42.nonzero? # => 42
В библиотеке Set
также есть add?
и delete?
. Я хочу, чтобы Enumerable#one?
возвратил nil
или false
, чтобы отличать случаи, когда счетчик равен нулю, когда он больше единицы.
Аналогичным примером являются операторы сравнения (<
, >
,...), которые обычно возвращают только true
или false
. Здесь снова существуют исключения для операторов Module
, которые возвратят nil
, если эти два модуля не связаны:
Array > Enumerable # => false
Array > Fixnum # => nil
Ответ 2
Добавление? к имени метода в Ruby является идиоматическим, что метод вернет true или false. Объект # nil? - хороший пример. На самом деле у Object есть много хороших примеров проверок правдоподобия.
Ответ 3
На ваш вопрос два ответа, и оба действительны:
Технически, все, возвращающее значение false
или nil
, действует как ложное логическое значение при выполнении условного теста, так же как значение non-nil или true
действует как истина. Таким образом, рассматриваемый метод будет работать правильно в большинстве случаев, когда вы хотите узнать, является ли что-то целым.
Но стилистически метод, который заканчивается на?? должен возвращать либо логический true
, либо false
и только те.
Этот метод не очень хорошо работает с нашими ожиданиями и не выполняет POLS ( "принцип наименьшего удивления" ), потому что вы можете разумно ожидать возвращения логического значения и получить целое число или нуль. Это может привести к неприятным неожиданностям в коде, когда он завершится с неожиданным значением nil
или значением Fixnum.
Итак, хотя это действительный метод, это не хороший метод, и я бы поднял его в обзоре кода. И это приводит к отдельному обсуждению того, как такие тонкие вещи могут улучшить или повредить обслуживание кода, но это совершенно другое обсуждение.
Ответ 4
Я переименовал этот метод, чтобы удалить ?
, что было действительно не важно для ответа на вопрос. Сканирование через основные функции, которые заканчиваются на? S, только те, которые я заметил, возвращали данные или ноль, были методами add?
и delete?
в Set.