rubyのパーサの挙動がよくわからない。((続)rubyのinjectにはバグがあるのか?)

rubyのinjectにはバグがあるのか? - 計算機と戯れる日々の続き


Enumerable#injectはおかしくない - http://rubikitch.com/に移転しましたよりトラックバックされて気がついた恥ずかしすぎる。ありがとうございます。
3時だったのでもう頭が回らなかったかも>完全に言い訳(笑


かっこわるぅ。


というか、schemeのfoldみたいなイメージでやってしまっていたなぁ。反省反省。


でもね、なんか変なの。

>> [1,2,2,3,2].inject([]){|a,i|i!=a[-1]?a<<i:a}
=> [1, 2, 3, 2]
>> [1,2,2,3,2].inject([]){|a,i|a[-1]!=i?a<<i:a}
SyntaxError: compile error
(irb):7: syntax error, unexpected tIDENTIFIER, expecting kDO or '{' or '('
[1,2,2,3,2].inject([]){|a,i|a[-1]!=i?a<<i:a}
                                      ^
(irb):7: syntax error, unexpected ':', expecting '}'
[1,2,2,3,2].inject([]){|a,i|a[-1]!=i?a<<i:a}
                                          ^
        from (irb):7
        from :0


よくわからないなぁ。

>> a=[1,2,3,4]
=> [1, 2, 3, 4]
>> a[-1]!="4"
=> true
>> a[-1]!="4"?"OK":"NG"
=> "OK"
>> "4"!=a[-1]?"OK":"NG"
=> "OK"
>> i="4"
=> "4"
>> i!=a[-1]?"OK":"NG"
=> "OK"
>> a[-1]!=i?"OK":"NG"
SyntaxError: compile error
(irb):7: syntax error, unexpected tSTRING_BEG, expecting kDO or '{' or '('
a[-1]!=i?"OK":"NG"
          ^
(irb):7: syntax error, unexpected ':', expecting $end
a[-1]!=i?"OK":"NG"
              ^
        from (irb):7
        from :0
>> (a[-1]!=i)?"OK":"NG"
=> "OK"

うわぁ。変数のときだけ…一瞬、演算子の優先順位かと思ったんだけど…プログラミング言語 Ruby リファレンスマニュアル


追記 2008/04/20 12:31:34:


ありがとうございます>anonさん

なんてことだ。

>> def i?;"OK";end
=> nil
>> i?
=> "OK"
>> i??"1":"2"
^C
>> i?"1":"2"
SyntaxError: compile error
(irb):15: syntax error, unexpected ':', expecting $end
i?"1":"2"
      ^
        from (irb):15
        from :0
>> (i?)?"1":"2"
=> "1"


3項演算子のときには変数直後の?はメソッド名を形成する文字になってるのか。
いいの?こんなへたれで(笑


追記 2008/04/20 22:34:04:

スペースで解決する…

>> a=[1,2,3,4]
=> [1, 2, 3, 4]
>> i=4
=> 4
>> a[-1]!=i ? "OK" : "NG"
=> "NG"