В Ruby, foo.bar
- это синтаксис для отправки сообщения . Сначала он оценивает выражение foo
(которое либо разыменовывает локальную переменную, либо сообщение без получателя отправляет неявному получателю self
), а затем отправляет сообщение bar
полученному объекту.
Один раз вы знаете, как выглядит отправка сообщения в Ruby, легко увидеть, что делает object.property?
: сначала он вычислит выражение object
(которое либо разыменовывает локальную переменную, либо отправляет сообщение без получателя, отправленное неявному получателю self
) и затем отправьте сообщение property?
полученному объекту.
Итак, в чем разница между ними? Ну, первый отправляет сообщение property
, а второй отправляет сообщение property?
. Это ничем не отличается от того, если бы первый был object.foo
, а второй - object.bar
.
Имена методов, заканчивающиеся на ?
, обычно используются для предиката методов, то есть для методов, которые задают вопрос «Да / Нет». Хороший пример: Numeric#zero?
.