44289


ruby ではスペースによって引数付きのメソッドコールを表すことができますが、これがどういうタイミングで可能なのかが分からないな、と思っています。

例えば、以下ではメソッドコールは成功します。

[code]

    [1] pry(main)> ([1].take 1).to_s
    => "[1]"
    
[/code]

しかし、以下では成功しません。

[code]

    [2] pry(main)> true ? [1] : [0].take 1
    SyntaxError: unexpected tINTEGER, expecting end-of-input
    true ? [1] : [0].take 1
                          ^
    
[/code]

この失敗している例において、文法的な解釈として、 `[0].take 1`
をひとつのメソッドコールとして解釈してくれてもいいかと思いましたが、(それ以外に正しい式の木を構築する方法がないはずなので)そうはなっていない様子です。

### 質問

ruby においてスペースによってメソッドコールができる文脈は何ですか?


CC BY-SA 4.0
2018-05-27T05:01:55.903
44287
2018-07-02T01:32:05.523
754
question
ruby
ruby でスペースによるメソッドコールが可能な文脈は?


[rubyの演算子順位表](https://docs.ruby-
lang.org/ja/latest/doc/spec=2foperator.html)を見ればいいと思います。  
`()`は演算順位が一番高く、`()`なしは演算順位が一番低い(`()`なしについては公式のドキュメントが見つけられませんでしたが)ので、

[code]

    true ? [1] : [0].take 1
    
[/code]

は演算順位が高い`?:(条件演算子)`が先に解釈されて

[code]

    (true ? [1] : [0].take) 1
    
[/code]

と同じ意味になり、

[code]

    [1] 1
    
[/code]

という意味になるので文法エラーになるのだと思います。

> ruby においてスペースによってメソッドコールができる文脈は何ですか?

これについては、[rubyの演算子順位表](https://docs.ruby-
lang.org/ja/latest/doc/spec=2foperator.html)を見ながら適宜確認するしかないと思います。  
(普通はそれは面倒なので怪しいところには`()`をつけてしまいます。)


CC BY-SA 4.0
2018-05-27T05:34:09.437
44289
2018-05-27T05:34:09.437
28630
44287
answer


追記として、どうやら、 スペースによる関数適用の結合順序は、 `?:` より下で、 `=`(代入) より上の様子です。

[code]

    result = some_method arg
    some_condition arg and return
    
[/code]

これらは、両方ともスペースによるメソッド適用がなされてから、代入なり and 移行の評価なりが行われている様子です。


CC BY-SA 4.0
2018-07-02T01:32:05.523
45226
2018-07-02T01:32:05.523
754
44287
answer