2

空の配列を複数の変数に割り当てたい。これが私がしていることです:

irb(main):015:0> a, b, c = []
=> []
irb(main):016:0> a
=> nil
irb(main):017:0> b
=> nil
irb(main):018:0> c
=> nil

それは私に与えますnil。なんでだろう?しかし、私がこれをした場合:

irb(main):019:0> a, b, c = [], [], []
=> [[], [], []]
irb(main):020:0> a
=> []
irb(main):021:0> b
=> []
irb(main):022:0> c
=> []

期待どおりに動作しますが、最初のものより少し長くなります。最初の例の何が問題になっていますか?

4

4 に答える 4

2

この例が問題を理解するのに役立つと思います:

[1] pry(main)> a, b, c = [1,2]
=> [1, 2]
[2] pry(main)> a
=> 1
[3] pry(main)> b
=> 2
[4] pry(main)> c
=> nil

問題に戻って、空の配列の要素を変数に割り当てようとしています。その結果、3 つの変数はすべて nil 値になります。

于 2013-01-20T09:22:10.160 に答える
1

単一の右辺値を使用した並列代入

割り当てに複数の左辺値と 1 つの右辺値が含まれている場合、Ruby は、右辺値に対して #to_a を呼び出したかのように、右辺値を配列に展開しようとします。したがって、あなたの例の問題は、a, b, c = []意味的に次のものと同等であることです。

a, b, c = nil.to_a

これは明らかに最初の変数に nil を割り当て、他の変数は未割り当てのままにします (これも nil です)。対照的に、次のことを考慮してください。

a, b, c = 1
a
# => 1
b
# => nil
c
# => nil

同じ原則が機能していますが、最初の左辺値右辺から代入を受け取っていることがわかります。割り当てがnilの場合は明らかではありませんでした。

于 2013-01-20T09:50:59.557 に答える
1
a = b = c = []

ただし、すべての変数に同じ配列が割り当てられることに注意してください

a = b = []
b << 1
p b        # [1]
p a        # [1]
于 2013-01-20T09:10:11.320 に答える
0

並列代入を行うと、Ruby は配列を分解します。

a, b, c = [:foo, :bar, :baz]
a # => :foo
b # => :bar
c # => :baz

エントリが少なすぎる配列を指定すると、残りの値が次のように設定されますnil

a, b, c = [:foo, :bar]
a # => :foo
b # => :bar
c # => nil

したがって、最初の例はこれの自然な拡張にすぎません-空の配列には、変数を割り当てるにはエントリが少なすぎます!

于 2013-01-22T00:06:52.520 に答える