我不确定下面的代码片段到底发生了什么.
>> 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)
在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]