变量分配混乱

时间:2013-08-02 01:00:13

标签: ruby-on-rails ruby switch-statement

我遇到了家庭作业问题,并通过查看某人的工作找到了解决方案。问题是我不明白。这是代码

ordering, @title_header = {:order => :title}, 'hilite'

在这种情况下,'订购'会发生什么?我试着谷歌搜索,看看这是一种方法,但找不到任何东西。

2 个答案:

答案 0 :(得分:6)

您所看到的实际上是列表扩展。 Ruby可以执行以下操作:

a, b = 1, 2

这基本上与:

相同
a = 1
b = 2

我会让剩下的让你知道。

答案 1 :(得分:1)

这是“并行分配”。

Ruby中的并行赋值是当有超过1个左值(即等号左边的值)和/或超过1个右值(等于右边的值)时发生的情况标志)。

要了解并行分配,需要考虑各种情况。

案例#1:左侧有一个值,右侧是多个值

第一个最简单的情况是有1个左值和多个右值。例如:

> a = 1, 2

> a
 => [1, 2] 

所有发生的事情都是将右侧逗号分隔的值列表转换为数组并分配给左侧变量。

案例#2:左侧有多个值,右侧有相同数量的值

第二种情况是左右数和左右数相同。例如:

> a,b = 'foo', 'bar'

> a
 => "foo" 
> b
 => "bar" 

这也非常简单 - 您只需评估右侧的每个项目,然后按顺序将其分配到左侧的相应变量。

案例#3:左边有多个值,右边有一个值 - 但它是一个数组

第三种情况是当rvalue是一个数组,并且该数组的元素在多个左值之间分布(或“扩展”)。例如:

> a, b = ['foo', 'bar']

> a
 => "foo" 
> b
 => "bar" 

这与上面的情况#2实际上相同,除非在这种情况下明确使用数组语法。

案例#4:左侧比右侧更多值

第四种情况是两侧都有多个值,并且左值比右值多。例如:

> a, b, c = 'foo', 'bar' # Note only 2 values on the right

> a
 => 'foo'
> b
 => 'bar'
> c
 => nil 

正如您所看到的,Ruby尽最大努力分发值,但是用尽了它们并被迫将nil分配给左侧的最后一个变量。

案例#5:右侧比左侧更多值

第五种情况是两侧都有多个值,并且左值比右值少。例如:

> a, b = 'foo', 'bar', 'baz' # Note only 2 values on the left

> a
 => 'foo'
> b
 => 'bar'

同样,Ruby尽最大努力分配这些值,但却有太多不能分发,并被迫将最右边的值(“baz”)发送到以太。

案例#6 +:Splatting

注意在上面的例子中,我们丢失了最后一个值。然而,实际上有可能捕获任何这样的多余值并将它们收集到一个数组中,使用一个名为“splat”运算符的相关运算符(由变量前面的星号组成,如*my_var中所示)。你可以用这个“splat”运算符做很多有用的事情,但是为了不过多地重复这个答案,最好去其他地方查看它的实例。例如,this blog post列出了几种变体用途。

注意:没有临时变量的交换

这个并行分配工具的一个很好的方面是你可以方便地交换值。

要在没有并行分配的情况下交换值,您可以编写如下内容:

> a = 'foo'
> b = 'bar'
> temp = a # Introduce a temp variable
> a = b
> b = temp

> a
 => "bar" 
> b
 => "foo" 

但是通过并行分配,您可以简单地依赖Ruby来隐式处理交换:

> a = 'foo'
> b = 'bar'
> b, a = a, b

> a
 => "bar" 
> b
 => "foo"