Какова цель оператора вопросительного знака в Ruby?
Иногда это выглядит так:
assert !product.valid?
иногда это в if
конструкте.
Какова цель оператора вопросительного знака в Ruby?
Иногда это выглядит так:
assert !product.valid?
иногда это в if
конструкте.
Ответы:
Это соглашение о стиле кода; это указывает, что метод возвращает логическое значение.
Знак вопроса является допустимым символом в конце имени метода.
?
в Ruby (это троичный оператор, преобразующий символ в его целое ASCII, использование в test
, в RegEx и т. Д.), Многие из которых описаны в других ответах здесь.
isEmpty()
, isDigit()
и т.д. В рубин, одни и те же методы были бы написаны empty?
, и digit?
что совсем немного лучше ИМО.
is
все время. Это может быть очень запутанным для кого - то наступающем из Swift с вопросительным знаком там используется для nullable
:)
Также обратите внимание, ?
вместе с символом, вернет код символа ASCII дляA
Например:
?F # => will return 70
Поочередно в ruby 1.8 вы можете сделать:
"F"[0]
или в рубине 1.9:
"F".ord
Также обратите внимание, что ?F
будет возвращена строка "F"
, поэтому, чтобы сделать код короче, вы также можете использовать ?F.ord
в Ruby 1.9, чтобы получить тот же результат, что и "F".ord
.
'F'
В вашем примере это только часть имени метода. В Ruby вы также можете использовать восклицательные знаки в именах методов!
Другим примером вопросительных знаков в Ruby может быть троичный оператор.
customerName == "Fred" ? "Hello Fred" : "Who are you?"
В вашем примере
product.valid?
На самом деле это вызов функции и вызывает функцию с именем valid?
. Некоторые типы «проверки состояния» / булевых функций имеют условный знак как часть имени функции.
Возможно, стоит отметить, что ?
s допускаются только в именах методов, а не в переменных. В процессе изучения Ruby я предполагал, что ?
это булев тип возвращаемого значения, поэтому я попытался добавить их в переменные флага, что привело к ошибкам. Это привело меня к тому, что какое-то время я ошибочно полагал, что существует какой-то особый синтаксис с использованием ?
s.
Соответствующий: Почему имя переменной не может заканчиваться на `?`, А имя метода может?
Я считаю, что это просто соглашение для вещей, которые являются булевыми. Немного как сказать " IsValid
".
Он также используется в регулярных выражениях, что означает «не более одного повторения предыдущего символа»
например, регулярное выражение /hey?/
совпадает со строками " he
" и " hey
".
Это также общее соглашение для использования с первым аргументом метода test из Kernel # 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
как видно из этого вопроса здесь
test
, ?d
это ярлык для "d"
. test
принимает в качестве первого аргумента строку из одного символа, поэтому вы можете вызвать ее с помощью test ?d, "/dev"
или test "d", "/dev"
.