Що означає оператор питання питання в Ruby?


211

Яка мета оператора знака питання в Ruby?

Іноді це виглядає так:

assert !product.valid?

іноді це в ifконструкції.


2
Знак питання в кінці функції - це не оператор, це звичайний символ. Знак питання разом з двокрапкою - це потрійний умовний оператор. Знак питання сам по собі є оператором одинарних пропозицій. Дивіться stackoverflow.com/questions/16641205/…
Старий Про

Відповіді:


296

Це угода про стиль коду; це вказує, що метод повертає булеве значення.

Знак питання є дійсним символом в кінці імені методу.


9
Дякую, але чи означає ця конвенція, що це лише логіка чи можуть бути побічні ефекти? Смішно, як це начебто хак навколо введених мов із типом return у коді.
Джейсон

5
У цьому випадку це строго метод іменування конвенції. Не відбувається примусового бульового повернення. Тільки тому, що назва методу закінчується знаком запитання, не означає, що метод повинен повернути булеве значення ... але він, безумовно, повинен повернути булевий. Однак є кілька інших застосувань ?у Ruby (це потрійний оператор, який перетворює персонаж у його ціле число ASCII, використання в test, в RegEx'es тощо), багато з яких висвітлено в інших відповідях тут.
Карл Вільбур

4
@Jason FYI, навіть сильно набрані мови мають подібні умови. Наприклад, у Java методи, які повертають булеве значення, часто мають префікс значення "є", як у isEmpty(), isDigit()і т. Д. У Ruby будуть написані ті самі методи empty?, і digit?це досить приємно IMO.
Ajedi32

3
Ajedi32 - Так, я погоджуюся, що приємно називати такі функції, як я isвесь час використовую. Це може бути дуже заплутаним для кого - то наступаючому з Swift зі знаком питання там використовується для nullable:)
Jason

83

Також примітка ?разом із символом поверне ASCII код символу дляA

Наприклад:

?F # => will return 70

По черзі в рубіні 1,8 ви можете:

"F"[0]

або в рубіні 1.9:

"F".ord

Також зауважте, що ?Fповертає рядок "F", тому для того, щоб скоротити код, ви також можете використовувати ?F.ordв Ruby 1.9, щоб отримати той же результат, що і "F".ord.


29
У рубіні 1.9 він повернеться'F'
знав

39

Це умова в Ruby, що методи, які повертають булеві значення, закінчуються знаком питання. Для цього немає більшого значення.


28

У вашому прикладі це лише частина назви методу. У Ruby ви також можете використовувати знаки оклику у назвах методів!

Іншим прикладом запитальних знаків у Ruby може бути термінальний оператор.

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

13
Щоб розширити відповідь Енді, ви також побачите такі речі, як: customerName == user.logged_in? ? user.name: "Хто ти?" Зверніть увагу на подвійний знак
запитання

16

У вашому прикладі

product.valid?

Це насправді виклик функції і викликає функцію з ім'ям valid?. Деякі типи функцій "тест на стан" / булева функція мають знак питання як частину назви функції за домовленістю.


41
answer.gsub! (/ function /, 'method')
glenn jackman

15

Можливо, варто зазначити, що ?s дозволено лише в назвах методів, а не в змінних. У процесі вивчення Ruby я припускав, що ?призначив булевий тип повернення, тому я спробував додати їх до змінних прапорців, що призводить до помилок. Це призвело до того, що я деякий час помилково вважав, що існує якийсь особливий синтаксис, що стосується ?s.

Відповідно: Чому ім’я змінної не може закінчуватися на "?", А ім'я методу може?


9

Я вважаю, що це просто умова для речей, що є бурхливими. Трохи, як сказати " IsValid".


1
лаконічний і дивовижний коментар спеціально "Трохи, як сказати" IsValid "
Kick

2

Він також використовується в регулярних виразах, що означає "щонайменше одне повторення попереднього символу".

наприклад, регулярний вираз /hey?/ збігається з рядками " he" і " hey".


0

Це також загальна умова використовувати з першим аргументом методу тестування з тесту Kernel #

irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true

як видно з цього питання тут


3
Це не пов’язано з test, ?dце ярлик для "d". testприймає одночастовий рядок як свій перший аргумент, тому ви можете викликати його за допомогою test ?d, "/dev"або test "d", "/dev".
bfontaine
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.