В ruby ​​ли правдивость идиоматична для имени метода, заканчивающегося знаком вопроса? - PullRequest
12 голосов
/ 27 ноября 2010

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

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

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

Ответы [ 4 ]

8 голосов
/ 27 ноября 2010

Добавление?для имени метода в Ruby идиоматично, что метод вернет true или false. Object # nil? хороший пример.На самом деле, у Object есть много хороших примеров проверок на правдивость.

6 голосов
/ 28 ноября 2010

Это обычно для методов, оканчивающихся на ?, для возврата либо 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 голосов
/ 27 ноября 2010

Я переименовал данный метод, чтобы удалить ?, который действительно не был важен для ответа на вопрос.Сканируя основные функции, оканчивающиеся на? S, я обнаружил только те, которые возвращали данные или ноль, это методы add? и delete? в Set.

2 голосов
/ 27 ноября 2010

Есть два ответа на ваш вопрос, и оба они действительны:

Технически, все, что возвращает значение false или nil, действует как ложное логическое значение при выполнении условного теста, так же как и не-nil или true значение действует как истина.Таким образом, рассматриваемый метод будет работать правильно в большинстве случаев, когда вы захотите узнать, является ли что-то целым числом.

Но стилистически это метод, заканчивающийся на '?'должен возвращать логическое значение true или false и только те.

Рассматриваемый метод не совсем соответствует нашим ожиданиям и не справляется с POLS («принципом наименьшего удивления»), потому что вы можете разумно ожидать возврата логического значения и получить целое число или ноль.Это может привести к неприятным сюрпризам в коде, когда он завершается с неожиданным значением nil или значением Fixnum.

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

...