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

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

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

assert !product.valid?

иногда это if строительство.

9 ответов


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

вопросительный знак является допустимым символом в конце имени метода.


также Примечание!--3--> вместе с символом, вернет код символа ASCII для A

например:

?F # => will return 70

поочередно в Ruby 1.8 вы можете сделать:

"F"[0]

или в ruby 1.9:

"F".ord

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


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


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

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

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

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

product.valid?

фактически является вызовом функции и вызывает функцию с именем valid?. Некоторые типы"тест для условия" /булевых функций имеют знак вопроса как часть имени функции по соглашению.


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

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


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


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

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


это также общее Соглашение для использования с первым аргументом тест метод ядро#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

Как видно из этого вопроса здесь