Какова цель оператора вопросительного знака в 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".