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

Должен ли метод заканчиваться? (вопросительный знак) возвращает только логическое значение?

Я думаю, что это просто здравый смысл и соглашение Ruby, но у меня есть этот метод:

def is_subscribed?(feed_url)
  Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url))
end

Единственная путаница, которую я получаю, это не возвращает логическое значение, как я и предполагал, поставив знак вопроса в конце имени метода. У меня создалось впечатление, что при оценке объекта как условного он возвращает true, если не nil.

По-видимому, я пропустил этот пункт и не оценил его, как я думал.

Итак, мой вопрос: было бы лучше всего сделать if (condition) true else false? Или есть более элегантный способ сделать это?

4b9b3361

Ответ 1

Метод, заканчивающийся? должен возвращать значение, которое может быть оценено как true или false. Если вы хотите обеспечить логическое возвращение, вы можете сделать это, добавив двойной поиск к поиску.

def is_subscribed?(feed_url)
  !!Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url))
end

Ответ 2

Добавление ? в конец имени метода никоим образом не изменяет возвращаемое значение метода, а указывает только, что это метод предиката. То есть, возвращаемое значение метода должно рассматриваться как логическое, но не обязательно должно быть строго логическим (т.е. true или false).

Многие из других ответов утверждают, что он должен вернуть значение, которое является правдивым или ложным. Это довольно избыточно, поскольку все может быть либо правдивым, либо ложным, и поскольку все методы в Ruby возвращают что-то (если только они не создают исключение), возвращаемое значение всегда правдиво или ложно.

Подумайте о добавлении ? в качестве лучшей альтернативы добавлению is_ на другие языки; например Я либо имел бы subscribed?, либо is_subscribed.

Ответ 3

Это должно быть "правдивое" или "ложное" значение, которое можно безопасно использовать в предикатах, но не нужно возвращать литерал true или false. Существуют даже такие методы, как File.size?, в стандартной библиотеке.

Ответ 4

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

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

Фактически недавно был отправлен запрос на тягу к проекту рельсов, который сосредоточил внимание на этом конкретном вопросе:

https://github.com/rails/rails/pull/5582

В основном, обсуждение было связано с этой точной проблемой - методы должны только возвращать значения, которые могут быть проверены как истинные или ложные, например:

if (condition)
  # do 'truthy option
else
  # do non-truthy option
end

С этой точки зрения, я считаю, что ваш метод в порядке.