我被困在一个家庭作业问题上,并通过查看某人的工作找到了解决方案。问题是我不明白。这是代码
ordering, @title_header = {:order => :title}, 'hilite'
在这种情况下,“订购”会发生什么?我试着用谷歌搜索看看这是否是一种方法,但找不到任何东西。
我被困在一个家庭作业问题上,并通过查看某人的工作找到了解决方案。问题是我不明白。这是代码
ordering, @title_header = {:order => :title}, 'hilite'
在这种情况下,“订购”会发生什么?我试着用谷歌搜索看看这是否是一种方法,但找不到任何东西。
您所看到的实际上是列表扩展。Ruby 可以执行以下操作:
a, b = 1, 2
这与以下内容基本相同:
a = 1
b = 2
剩下的留给你自己去琢磨吧。
这是“并行分配”。
当有超过 1 个左值(即等号左侧的值)和/或超过 1 个右值(等号右侧的值)时,Ruby 中的并行赋值会发生。
要理解并行分配,需要考虑多种情况。
第一种最简单的情况是存在 1 个左值和多个右值。例如:
> a = 1, 2
> a
=> [1, 2]
所发生的只是将右侧逗号分隔的值列表转换为数组并分配给左侧变量。
第二种情况是存在相同数量的左值和右值。例如:
> a,b = 'foo', 'bar'
> a
=> "foo"
> b
=> "bar"
这也很简单——您只需评估右侧的每个项目,然后按顺序将其分配给左侧的相应变量。
第三种情况是右值是一个数组,并且该数组的元素分布(或“扩展”)多个左值。例如:
> a, b = ['foo', 'bar']
> a
=> "foo"
> b
=> "bar"
这实际上与上面的案例 #2 相同,除了在这种情况下明确使用数组语法。
第四种情况是两边都有多个值,并且左值比右值多。例如:
> a, b, c = 'foo', 'bar' # Note only 2 values on the right
> a
=> 'foo'
> b
=> 'bar'
> c
=> nil
如您所见,Ruby 尽其所能分配值,但用尽了它们并被迫分配nil
给左侧的最后一个变量。
第五种情况是两边都有多个值,并且左值比右值少。例如:
> a, b = 'foo', 'bar', 'baz' # Note only 2 values on the left
> a
=> 'foo'
> b
=> 'bar'
再一次,Ruby 尽其所能分配值,但有太多无法分配,并被迫将最右边的值(“baz”)发送到以太中。
请注意,在上述情况下,我们丢失了最后一个值。然而,实际上可以使用称为“splat”运算符的相关运算符(它由变量前面的星号组成,如*my_var
)来捕获任何此类多余的值并将它们收集到一个数组中。你可以用这个“splat”操作符做很多有用的事情,但为了不让这个答案太多,最好去别处看看它的例子。例如,这篇博文列出了几种变体用途。
这种并行分配工具的一个优点是您可以方便地交换值。
要在没有并行赋值的情况下交换值,您可以编写如下内容:
> 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"