2009-08-28 110 views
156

Ruby中問號運算符的用途是什麼?Ruby中的問號運算符是什麼意思?

有時會出現這樣的:

assert !product.valid? 

有時是在if結構。

+0

問號是不是一個運營商,這是一個普通的字符。問號和冒號一起是一個三元條件操作符。問號本身是一個單引號運算符。請參閱http://stackoverflow.com/questions/16641205/what-does-the-unary-question-mark-operator-do – 2017-01-07 02:01:39

回答

215

這是一種代碼風格約定;它表示一個方法返回一個布爾值。

問號是方法名稱末尾的有效字符。

+4

謝謝,但這種約定意味着它只有_logic或可能有副作用嗎?有趣的是,這是如何繞着代碼中的返回類型的類型化語言進行破解的。 – Jason 2012-11-20 21:36:10

+1

這種情況嚴格地說是一種方法命名約定。沒有布爾返回值的強制執行。只是因爲方法名以問號結尾並不意味着方法*必須*返回一個布爾值......但它絕對是*應該*返回一個布爾值。然而,在Ruby中有'?'的其他用法(是一個三元運算符,將字符轉換爲ASCII整數,在'test'中的用法,RegEx中等等),其他答案中涵蓋了其中的許多內容這裏。 – 2015-09-11 20:36:39

+2

@Jason FYI,甚至強類型語言都有這樣的約定。例如,在Java中,返回布爾值的方法通常以「is」爲前綴,如'isEmpty()','isDigit()'等。在Ruby中,相同的方法將被寫爲'empty?', '數字?'這是比較好的海事組織。 – Ajedi32 2015-12-28 17:27:50

35

這是Ruby中的一個約定,即返回布爾值的方法以問號結束。沒有比這更重要的了。

5

我相信這只是布爾事物的約定。有點像說「IsValid」。

+0

特別簡潔和真棒評論「有點像說」IsValid「 – 2016-04-05 21:00:27

14

在您的例子

product.valid? 

實際上是一個函數調用,並調用一個名爲valid?功能。按照慣例,某些類型的「條件測試」/布爾函數具有問號作爲函數名稱的一部分。

+37

answer.gsub!(/ function /,'method' ) – 2009-08-28 10:28:02

+0

好評... lolz – 2009-08-31 19:33:11

21

在你的例子中,它只是方法名稱的一部分。在Ruby中,您還可以在方法名稱中使用感嘆號!

Ruby中問號的另一個例子是三元運算符。

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

爲了擴大Andy的回答,你還會看到諸如:customerName == user.logged_in??user.name:「你是誰?」請注意雙重問號 – 2009-08-28 09:13:29

1

它也正則表達式使用的,意思是「在前面的字符的最一個重複」

例如正則表達式匹配/hey?/與琴絃「he」和「hey」。

69

還要注意?與字符一起,將返回字符的ASCII碼爲A

例如:

?F # => will return 70 

交替紅寶石1.8,你可以這樣做:

"F"[0] 

或在紅寶石1.9中:

"F".ord 

另請注意,?F將返回字符串"F",因此爲了縮短代碼,您還可以使用Ruby 1.9中的?F.ord獲得與"F".ord相同的結果。

+2

有趣,謝謝 – rtacconi 2009-12-10 18:14:33

+25

在ruby 1.9它會返回''F'' – klew 2010-02-08 12:27:17

+2

只是我正在尋找的細節 – 2011-05-09 15:43:43

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 2015-04-24 17:54:27

10

這可能是值得指出的是,?的只允許在方法的名稱,而不是變量。在學習Ruby的過程中,我假設?指定一個布爾返回類型,所以我試圖添加它們來標記變量,導致錯誤。這導致我錯誤地認爲有一段時間涉及到一些特殊的語法。

相關:在函數結束Why can't a variable name end with `?` while a method name can?