2009-08-28 2 views
156

Какова цель оператора вопроса в Ruby?Что означает оператор «знак вопроса» в Ruby?

Иногда кажется, как это:

assert !product.valid? 

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

+0

Вопросительный знак в конце функции не является оператором, это обычный символ. Вопросительный знак вместе с двоеточием является тернарным условным оператором. Вопросительный знак сам по себе является унарным оператором котировки. См. Http://stackoverflow.com/questions/16641205/what-does-the-unary-question-mark-operator-do –

ответ

215

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

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

+4

Спасибо, но означает ли это, что это означает только _logic_ или могут быть побочные эффекты? Забавно, как это хак по типичным языкам с типом возврата в коде. – Jason

+1

В этом случае это строго соглашение об именовании метода. Не существует принудительного ввода логического возвращаемого значения. Просто потому, что имя метода заканчивается знаком вопроса, это не значит, что метод * должен * возвращать логическое ... но он определенно должен * возвращать логическое значение. Однако существует несколько других видов использования '?' В Ruby (это тройной оператор, преобразование символа в его целое ASCII, использование в 'test', в RegEx'es и т. Д.), Многие из которых описаны в других ответах Вот. –

+2

@Jason FYI, даже строго типизированные языки имеют подобные соглашения. Например, в Java-методах, возвращающих логическое значение, часто префикс «is», как в 'isEmpty()', 'isDigit()' и т. Д. В Ruby те же методы будут написаны 'empty?' И 'digit? ', что немного лучше IMO. – Ajedi32

35

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

5

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

+0

краткий и замечательный комментарий специально« Немного похоже на высказывание «IsValid» –

14

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

product.valid? 

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

+37

answer.gsub! (/ Function /, 'method') –

+0

Хороший комментарий ... lolz –

21

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

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

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

Чтобы расшифровать ответ Andy, вы также увидите такие вещи, как: customerName == user.logged_in?? User.name: «Кто вы?» Обратите внимание на знак двойного вопроса –

1

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

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

69

отметить также ? наряду с характером, возвращает код ASCII символов для A

Например:

?F # => will return 70 

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

"F"[0] 

или в рубине 1,9:

"F".ord 

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

+2

Интересно, спасибо – rtacconi

+25

В ruby ​​1.9 он будет возвращать '' F'' – klew

+2

Просто деталь, которую я искал. –

0

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

Это не связано с 'test','? d' является ярлыком для '' d "'. ' test' принимает в качестве первого аргумента строку с одним символом, поэтому вы можете вызвать ее с помощью «test? d», «dev» или «test» d »,«/dev ». – bfontaine

10

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

Соответствующие: Why can't a variable name end with `?` while a method name can?

Смежные вопросы