5

並列代入の戻り値をテストしたいのですが、 と書いputs (x, y = 1, 2)たのですが、うまくいかず、次のエラー メッセージが表示されます。

SyntaxError: (irb):74: syntax error, unexpected ',', expecting ')'
puts (x,y =1,2)
    ^
(irb):74: syntax error, unexpected ')', expecting end-of-input

何か間違っていることでも?

4

5 に答える 5

12

2 つの問題があります。

  1. putsとの間のスペースは(、括弧で囲まれたリストが引数リストとして解釈されるのを防ぎます。メソッド名の後にスペースを入れると、引数リストは括弧の外側にある必要があり、括弧で囲まれた部分は有効な式でなければなりません。Ruby では、(x,y,z)は正当な単一式ではないため、上記のエラーが発生します。

    スペースを削除すると、次のようになります。

    > puts(x, y = 1, 2)    
    NameError: undefined local variable or method `x' for main:Object
    

    それはあなたの2番目の問題のためです:

  2. ステートメントputs(x,y = 1,2)は次のように解析されputs(x, y=1, 2)ます。つまり、Rubyは、1番目、2 番目、 3 番目の 3putsつ の引数を渡すと解釈します。は割り当ての左側になく、まだ定義されていないため、上記のエラーが発生します。xy=12x

    余分な括弧を使用して、割り当て全体を 1 つの引数としてグループ化します。

    > puts((x,y=1,2))    
    1    
    2    
    

ただし、これは2 つのアイテムを含む単一のリストを渡していることに注意してください。との違いはありませんが、putsリストと個々のパラメーターを区別するメソッドの場合は違います。

> def foo(a,b) puts "a=#{a},b=#{b}" end
> foo((x,y=1,2))
ArgumentError: wrong number of arguments (1 for 2)

その場合、もう 1 つ句読点が必要です - スプラット演算子:

> foo(*(x,y=1,2))   
a=1, b=2

興味深いことに、実際にはほとんど関係ありませんが、括弧を 2 倍にすると、必要に応じてスペースを元に戻すことができます。

> puts ((x, y = 1, 2))    
1    
2    

しかし、繰り返しますが、それはそれらを引数ラッパーから単なる追加の式ラッパーに変えます。何も変更せずに、その周りに任意の数の括弧を配置できます。つまり、このfoo場合、splat 演算子は両方の括弧のセットの外に出る必要があります。

> foo (*(x,y=1,2))
SyntaxError: (irb):24: syntax error, unexpected tSTAR
> foo *((x,y=1,2))
a=1, b=2

ただし、最初の引数自体に括弧が含まれている場合に括弧なしの形式を使用することは、Ruby では一般的に不適切なスタイルと見なされます。Ruby のバージョンによっては、このようなステートメントに対して警告が表示される場合がありますが、警告が表示されない場合でも、完全に括弧で囲まれたバージョン (メソッド名の後にスペースを入れない) を使用することをお勧めします。

于 2013-10-16T12:36:30.063 に答える
1

putsは、パラメーターを受け取って出力するメソッドです。メソッドでは、パラメーター値を任意のデフォルト値に設定できます。あなたの場合、並列割り当てではなく、デフォルト値の設定です。もしそうなら

>puts(a, b = 1, 2)
=> undefined local variable or method `a' for main:Object
from (irb):1

ただし、「a」の値を設定する場合は、「a = 99」と言って実行します

 >puts(a, b = 1, 2)
 99
 1
 2
 => nil 

ruby では「()」を明示的に指定すると、メソッド名と冒頭 (

 def hi(x,y,z)
    p x
    p y
    p z
 end
 => nil 

 2.0.0p247 :015 > hi(1,2,3)
 1
 2
 3
 => 3 

 2.0.0p247 :016 > hi (1,2,3)
 SyntaxError: (irb):16: syntax error, unexpected ',', expecting ')'
 hi (1,2,3)
  ^
from /home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties-   4.0.0/lib/rails/commands/console.rb:90:in `start'
from /home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
from /home/prasad/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'

 2.0.0p247 :017 > hi 1, 2, 3
 1
 2
 3
 => 3 
于 2013-10-16T12:39:56.530 に答える
1

puts=はメソッドであり、 (代入)の戻り値をそれに渡そうとしています。そのためには、2 組の括弧で囲む必要があります。

puts((x, y = 1, 2))

ただし、これはコードの混乱につながるため、避ける必要があります。

代わりに、2 つのステップで行う方が簡単でクリーンです。

x, y = 1, 2
puts x, y

putsさらに、機能を壊さずに行を削除できます。

于 2013-10-16T12:40:34.640 に答える