1
  • 1つの括弧:

    print ( (1..10).collect do |x| x**2 end )
    SyntaxError: compile error
    

    詳細:

    (irb):1: syntax error, unexpected kDO_BLOCK, expecting ')'
    print ( (1..10).collect do |x| x**2 end )
                              ^
    (irb):1: syntax error, unexpected kEND, expecting $end
    print ( (1..10).collect do |x| x**2 end )
                                           ^
    
  • 2つの括弧:

    print (( (1..10).collect do |x| x**2 end ))
    149162536496481100=> nil
    

print (a) do <...>との違いがわかりprint(a) do <...>ます。しかし、私の場合の違いは何ですか?2つの括弧が1つと同じではないのはなぜですか?

4

2 に答える 2

1

TL;DR

余分な括弧を追加して「機能する」理由は、ネストされた括弧が最も内側の式により高い優先順位を与えるためです。これにより、パーサーのトークンが明確になり、ステートメントがメソッドの引数ではなく式として適切に評価されるようになります。

分析

これは、キーワードのバインディングの優先順位と関係があります。中括弧は do/end キーワードよりも優先順位が高いため、次のようにするとうまくいきます。

print ( (1..10).collect { |x| x**2 } )

これは、括弧で囲まれた式をメソッド引数の境界としてではなく、式の境界として解釈しているためです。

次のこともできます。

print( (1..10).collect do |x| x**2 end )

ここでは、括弧が式を区切るのではなく、引数をバインドしているためです。

于 2012-06-24T17:08:51.463 に答える
0

これを使って:

print((1..10).collect do |x| x**2 end)

そして、これがより良い:

print((1..10).collect do |x|; x**2; end)

メソッド名と括弧の間のスペースは必ず削除してください。ruby インタプリタの構文解析の一つです。スペースと括弧を同時に入れると、ruby が正しく解釈できない場合があります。

1 行に複数行のコードを入れる場合は、区切りを使用;します (do end ブロックは別行に配置する必要があるため)。

于 2012-06-24T17:19:56.687 に答える