Что означает оператор вопросительного знака в Ruby? - PullRequest
185 голосов
/ 28 августа 2009

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

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

assert !product.valid?

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

Ответы [ 9 ]

266 голосов
/ 28 августа 2009

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

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

77 голосов
/ 10 декабря 2009

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

Например:

?F # => will return 70

Альтернативно в ruby ​​1.8 вы можете сделать:

"F"[0]

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

"F".ord

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

38 голосов
/ 28 августа 2009

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

24 голосов
/ 28 августа 2009

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

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

customerName == "Fred" ? "Hello Fred" : "Who are you?"
15 голосов
/ 28 августа 2009

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

product.valid?

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

12 голосов
/ 31 марта 2015

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

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

6 голосов
/ 28 августа 2009

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

1 голос
/ 28 августа 2009

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

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

0 голосов
/ 10 апреля 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...