Подтвердить что ты не робот

В рубине, правда лидиоматично для имени метода, заканчивающегося вопросительным знаком?

Нормально ли для методов с вопросительным знаком возвращать что-то истинное (например, число), чтобы указать, что что-то истинно, или нужно вернуть true?

Есть ли примеры правды, которые используются в стандартной библиотеке Ruby или Rails, например?

Фон: Кто-то написал метод String#int? в ответе на отдельный вопрос, в котором было возвращено целое число для представления true и nil для представления false. Другой пользователь был удивлен тем, что не возвращал логическое значение.

4b9b3361

Ответ 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.