Rubyで疑問符演算子はどういう意味ですか?


211

Rubyの疑問符演算子の目的は何ですか?

時々それはこのように見えます:

assert !product.valid?

時々それはif構造の中にあります。


2
関数の最後にある疑問符は演算子ではなく、通常の文字です。疑問符とコロンは、3項条件演算子です。疑問符はそれ自体が単項引用演算子です。stackoverflow.com/questions/16641205/…を
Old Pro

回答:


296

これはコードスタイルの規則です。メソッドがブール値を返すことを示します。

疑問符は、メソッド名の末尾にある有効な文字です。


9
おかげで、しかし、この規則はそれがロジックのみを行うことを意味するのですか、それとも副作用があるのでしょうか?これがコード内の戻り型を使用した型付き言語のハックの一種であるというのはおかしい。
Jason、

5
この場合は、厳密にメソッドの命名規則です。ブール値の戻り値は適用されません。ただ、疑問符でのメソッド名の端は方法があることを意味するものではありませんので、しなければならないブール値を返す...しかし、それはほとんど間違いなくすべきであるブール値を返します。ただし?、Ruby には他にもいくつかの使い方があります(3項演算子、文字をそのASCII整数に変換、testRegExでの使用など)。その多くは、ここでの他の回答で説明されています。
Karl Wilbur

4
@Jason FYI、強く型付けされた言語でさえ、このような規則があります。例えば、多くの場合、接頭辞れるブール値を返すJavaメソッドでのように、「ある」isEmpty()isDigit()などでRubyは、同じ方法が書き込まれるempty?と、digit?かなりのよりよいがIMOです。
Ajedi32

3
Ajedi32-ええ、関数にそのような名前を付けるのはうれしいことに同意しisます。私はいつも使用しています。疑問符が次の目的で使用されるため、Swiftから来た人にとってこれは非常に混乱するかもしれませんnullable:)
Jason

83

また?、文字とともに、ASCII文字コードを返します。A

例えば:

?F # => will return 70

または、ruby 1.8では次のことができます。

"F"[0]

またはルビー1.9では:

"F".ord

また?F、は文字列を返す"F"ので、コードを短くするために?F.ord、Ruby 1.9でと同じ結果を得ることができます"F".ord


29
ruby 1.9ではそれが返ります'F'
2010

39

ブール値を返すメソッドが疑問符で終わるのはRubyの規則です。それ以上の意味はありません。


28

あなたの例では、それはメソッド名の一部にすぎません。Rubyでは、メソッド名に感嘆符を使用することもできます。

Rubyの疑問符のもう1つの例は、3項演算子です。

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に関連する特別な構文があると誤って信じていました。

関連性:変数名が `?`で終わらないのに、メソッド名は終わらないのはなぜですか?



2

正規表現でも使用され、「直前の文字の最大1回の繰り返し」を意味します。

たとえば、正規表現/hey?/ は文字列 " he"および " hey" と一致します。


0

また、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

この質問でここに見られるように


3
それはに関連していないtest?dためのショートカットです"d"test最初の引数として1文字の文字列を取るため、test ?d, "/dev"またはで呼び出すことができますtest "d", "/dev"
bfontaine
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.