我想知道如何声明多个变量。我输入a,b=1
期望获得a=1,b=1
,但我得到了:
a,b=1
a #=> 1
b #=> nil
我怎么能这样做?
在这段代码之后,我做了:
a="Hello "
b=a
c="World~"
b << c
b #=> "Hello World"
为什么b
与a
的值相同?
答案 0 :(得分:3)
要在同一行声明多个变量,您可以这样做:
a = b = "foo"
puts a # return "foo"
puts b # return "foo" too
关于您的第二个问题,在执行b << c
时,您要将c
的值分配给b
。然后,您将覆盖存储在b
中的先前值。同时,a
保持相同的值,因为Ruby不是用户指针。
答案 1 :(得分:2)
您正在做的事情称为解构分配。基本上,你取出等号右边的东西,然后对其进行解构,或将它拆开,然后将每个部分分配给左边的每个相应变量。
Ruby非常友好,并提供一些可能令人困惑的语法糖。
键入时:
a, b = 1
你真的在说更接近这个:
[a, b] = [1, nil]
可以找到解构分配的一个很好的例子here。它适用于JavaScript,但我喜欢它,因为语法非常明确,当你做这样的分配时会发生什么。
答案 2 :(得分:0)
我想,在
的情况下a, b, c = 1, 2
运行时系统的工作方式如下:
a, b, c = [1, 2]
_result = ( a, b, c = (_values = [1, 2]) )
a = _values[0] # => 1
b = _values[1] # => 2
c = _values[2] # => nil
_result = _values # => [1, 2]
但是,如果右侧是单个值:a, b = 1
,则计算过程看起来有点不同:
_result = ( a, b = ( _value = (_values = [1]).first ) )
a = _values[0] # => 1
b = _values[1] # => nil
_result = _value # => 1
有人可以批准或反驳我的假设吗?