せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】クエスチョンマークが三つで何になる? ??? ?記法

 
 
■topic summary
what means -> a???


タイトル意味分からないね。
 

 
そらはさんのツイートでこんなのを見つけたよ。

 
へー?
なんでなんだろう?
わからないなー。
しらべてみよう!


 

本当?

まずは本当かしらべてみよう

class Q
  def self.foo
  end
end
Q. foo.a???

 
■実行結果

:in `<main>': undefined method `a?' for nil:NilClass

おお!
たしかに!

 
クエスチョンマークが3つっていうのが怪しいよね。
2つだとどうなるんだ?
 
■実行結果

syntax error, unexpected end-of-input

へー!?

 

クエスチョンマークをつかったリテラル記法

数値リテラル
?a
文字 a を表す String

http://docs.ruby-lang.org/ja/2.0.0/doc/spec=2fliteral.html

 
こんなヒントをみつけた。
 
なるほどね!

p ??

 
■実行結果

"?"

 
だから、この↓結果は

a(??)

■実行結果

 undefined method `a' for main:Object (NoMethodError)

これは、aメソッドに引数「?」を渡していると解釈されているんだね。



 
括弧でくくらないと、クエスチョンマークはメソッド名の一部としてパースされる

p a??

 
■実行結果

syntax error, unexpected end-of-input

これは、a?メソッドに渡す引数が?記法を使っていると解釈されていて、
その?記法に対する引数が期待されているのに渡してないから、
シンタックスエラーになってしまう。



 
本題の

a???

は、

a?(??)

と書き直すと分かりやすく、
 
■実行結果

undefined method `a?' for main:Object (NoMethodError)

つまり、引数として「?」を渡したa?メソッドを実行しようとしているけど、
a?メソッドががみつからないよ、というエラー。




なるほどー。