为什么带有字符串数组的ruby并行赋值返回字符串

CHK*_*CHK 7 ruby

我不确定下面的代码片段到底发生了什么.

>> a, b = ["ho", "hey"]
=> ["ho", "hey"]
>> a
=> "ho"
>> b
=> "hey"    
>> c, d = "foo", "bar"
=> ["foo", "bar"]
>> c 
=> "foo"
>> d
=> "bar"
>> a, b = ["blerg"], ["baz"]
=> [["blerg"], ["baz"]]
>> a
=> ["blerg"]
>> b 
=> ["baz"]
Run Code Online (Sandbox Code Playgroud)

为什么第1行不会返回a => ["ho"]?

所以在幕后,什么是这三个任务之间的差异(a, b = ["ho", "hey"],c, d = "foo", "bar",a, b = ["blerg"], ["baz"])?

Lin*_*nus 11

a, b = ["ho", "hey"] 
Run Code Online (Sandbox Code Playgroud)

a被赋予数组的第一个元素,即字符串"ho".没什么奇怪的.

a, b = ["blerg"], ["baz"]

a, b = [["blerg"], ["baz"]]
Run Code Online (Sandbox Code Playgroud)

这两个是相同的,你可以通过它们的返回值看到.所以给a分配了第一个元素,它是一个带有一个元素的数组:["blerg"].

同样的,

c, d = "foo", "bar"
Run Code Online (Sandbox Code Playgroud)

是相同的

c, d = ["foo", "bar"]
Run Code Online (Sandbox Code Playgroud)


Ami*_*pta 7

在Ruby中,= 获取左侧的变量列表和右侧的表达式列表.它将第一个变量赋值给第一个表达式的值,第二个变量赋值第二个表达式的值,依此类推.如果变量多于表达式,则为剩余变量赋值nil.

> a, b, c, d = "foo", 2+3, Array.new(2, 3), [:c, :d]
> a     # => "foo"
> b     # => 5
> c     # => [3, 3]
> d     # => [:c, :d]
> e     # => nil
Run Code Online (Sandbox Code Playgroud)

有两个例外:

左侧只有一个变量,右侧有多个表达式

在这种情况下,上述规则会将变量设置为右侧第一个表达式的值.相反,变量设置为由右侧表达式的值组成的数组.在下面的示例中,我们看到a获取值[:b, :c],而不仅仅是:b:

> a = :b, :c
> a    # => [:b, :c]
Run Code Online (Sandbox Code Playgroud)

这相当于:

> *a = :b , :c
> a    # => [:b, :c]
Run Code Online (Sandbox Code Playgroud)

另一个例外:

左侧有多个变量,右侧只有一个表达式,它是一个数组

同样,原始规则意味着第一个变量设置为整个数组,其余变量将为零.但是,该Array有效地最终会被其元素列表替换,然后=恢复为开头所述的"默认"行为:

> a, b, c = [:d, [:e, :f]]
> a    # => :d
> b    # => [:e, :f]
> c    # => nil
Run Code Online (Sandbox Code Playgroud)

这相当于a, b, c = *[:d, [:e, :f]]或仅仅是a, b, c = :d, [:e, :f]