【Ruby】クエスチョンマークが三つで何になる? ??? ?記法
■topic summary
what means -> a???
タイトル意味分からないね。
そらはさんのツイートでこんなのを見つけたよ。
Q. foo.a??? が undefined method "a?" になるのは何故でしょうか。 (ruby) (理由意外にしらない人がおおかったので)
— そらは (@sora_h) November 14, 2013
へー?
なんでなんだろう?
わからないなー。
しらべてみよう!
本当?
まずは本当かしらべてみよう
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
へー!?
クエスチョンマークをつかったリテラル記法
数値リテラル
http://docs.ruby-lang.org/ja/2.0.0/doc/spec=2fliteral.html
?a
文字 a を表す String
こんなヒントをみつけた。
なるほどね!
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?メソッドががみつからないよ、というエラー。
なるほどー。