Ruby奇数逗号与一系列变量一起使用

Vik*_*man 2 ruby variables comma sequence

您好StackOverflow的工作人员!

我们正在做一些Ruby,似乎有一个例子似乎很难弄清楚:

a=5
b=4
a,b=a+b,a

=> [9,5]
=> a=9
=> b=5
Run Code Online (Sandbox Code Playgroud)

怎么来的?那里发生了什么事?为什么它起作用而“ a,b,a”不起作用?为什么“ b”变成5而“ a”变成9?

如果我们只写

a,b=a+b

=> 9
=> a=9
=> b=nil
Run Code Online (Sandbox Code Playgroud)

我们猜测这是某种Ruby错误,将在2.5版中修复。也许有一些潜在的法律已经实施,但我们还没有看到。

你们会帮助我们吗?

该示例代码是Stanford Ruby课程的一个测验问题的一部分。他们告诉我们在遇到问题时要去问StackOverflow天才。

que*_*atl 5

对我来说,似乎您在理解并行分配运算符的用法,而不是Ruby错误。

前者和后者的示例非常不同。让我们在一起:

a,b=a+b,a
a,b=a+b
Run Code Online (Sandbox Code Playgroud)

现在添加一些空格

a,b =  a+b, a
a,b =  a+b
Run Code Online (Sandbox Code Playgroud)

第一个表达式是与的LHS a, b和RHS的a+b , a并行分配,后者是和的LHS a, b和RHS的并行分配a+b。注意RHS的区别。

这两个等于:

(1)

a =  a+b
b =  a'   **
Run Code Online (Sandbox Code Playgroud)

(2)

a =  a+b
b =  nil
Run Code Online (Sandbox Code Playgroud)

但是,请记住,这都是一次操作。因此,在(1)的情况下,它是A'而不是A:使用了'a'的旧值,而不是刚分配的'a + b'中的值-因为原始的并行分配是ONE OPERATION,而不是两次运算就像我在这里出于分解目的将其分解一样。

这意味着:

a,b = a+b, a
Run Code Online (Sandbox Code Playgroud)

导致s1=a+b要计算,s2=a要计算,然后a=s1; b=s2;仅在“一次操作”中。

由于它是一个操作,并且分配给两个值,因此将返回一个包含两个元素的数组-与执行单数分配和返回单个值相反。

如果您要执行三重分配:

a,b,c,d,e,f  = 0,1,2,3,4,5
Run Code Online (Sandbox Code Playgroud)

数组[0,1,2,3,4,5]将成为结果,并且a / b / c / d / e / f将分别分配0/1/2/3/4/5值。

有关更多信息,请参见Ruby的文档以了解并行分配,还可能*用于数组扩展和参数分组的运算符