Что означает оператор "знак вопроса" в Ruby?

Какова цель оператора вопросительного знака в Ruby?

Иногда это выглядит так:

assert !product.valid?

иногда это в конструкции if.

Ответ 1

Это соглашение о стиле кода; это указывает, что метод возвращает логическое значение.

Значок вопроса является допустимым символом в конце имени метода.

Ответ 2

Также обратите внимание, что ? вместе с символом вернет код символа ASCII для A

Например:

?F # => will return 70

Альтернативно в рубине 1.8 вы можете:

"F"[0]

или в рубине 1.9:

"F".ord

Также обратите внимание, что ?F вернет строку "F", поэтому, чтобы сделать код короче, вы также можете использовать ?F.ord в Ruby 1.9, чтобы получить тот же результат, что и "F".ord.

Ответ 3

Это соглашение в Ruby, что методы, возвращающие логические значения, заканчиваются вопросительным знаком. Нет больше значения для этого, чем это.

Ответ 4

В вашем примере это просто часть имени метода. В Ruby вы также можете использовать восклицательные знаки в именах методов!

Другим примером вопросительных знаков в Ruby будет тернарный оператор.

customerName == "Fred" ? "Hello Fred" : "Who are you?"

Ответ 5

В вашем примере

product.valid?

На самом деле это вызов функции и вызывает функцию с именем valid?. Некоторые типы "test for condition" /boolean функции имеют знак вопроса как часть имени функции по соглашению.

Ответ 6

Возможно, стоит указать, что? s разрешены только именами методов, а не переменными. В процессе обучения Ruby я предполагал это? обозначил логический тип возврата, поэтому я попытался добавить их к переменным флага, что привело к ошибкам. Это привело к тому, что я ошибочно полагал, что существует некоторый специальный синтаксис, связанный с .s.

Релевантно: Почему имя переменной не может заканчиваться символом`? `, а имя метода может?

Ответ 7

Я считаю, что это просто соглашение для вещей, которые являются логическими. Немного нравится говорить "IsValid".

Ответ 8

Он также используется в регулярных выражениях, что означает "не более одного повторения предыдущего символа"

например, регулярное выражение /hey?/ соответствует строкам "he" и "hey".

Ответ 9

Это также общепринятое соглашение для использования с первым аргументом метода test из Ядро # тест

irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true