Ruby 奇数逗号与一系列变量一起使用 [关闭]

Posted

技术标签:

【中文标题】Ruby 奇数逗号与一系列变量一起使用 [关闭]【英文标题】:Ruby odd comma use with a sequence of variables [closed] 【发布时间】:2013-03-07 16:05:38 【问题描述】:

你好 *** 工作人员!

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

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

=> [9,5]
=> a=9
=> b=5

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

如果我们只写

a,b=a+b

=> 9
=> a=9
=> b=nil

我们猜测这是某种 Ruby 错误,将在 2.5 版中修复。 或者可能有一些基本的法律已经实施,我们只是还没有看到。

你们会帮助我们吗?

示例代码是斯坦福 Ruby 课程的一个测验问题的一部分。他们让我们在遇到困难时去问问 *** 天才。

【问题讨论】:

这不是 Ruby 的错误。如果您认为它有问题,那是您的错误。尤其是初学者,不要轻易怀疑软件的bug;这更有可能是你的错误。 这被称为并行分配不是一个错误,问题很有趣:) 注意操作顺序。 a+b 出现在 = 之前。 谢谢你,我会记住的。 谢谢你,阿比!我喜欢你觉得这个问题很有趣! 【参考方案1】:

对我来说,您似乎误解了并行赋值运算符的用法,而不是 Ruby 错误。

前面和后面的例子有很大的不同。让我们把它们放在一起:

a,b=a+b,a
a,b=a+b

现在添加一些空格

a,b =  a+b, a
a,b =  a+b

第一个表达式是LHS 为a, b 和RHS 为a+b , a 的并行赋值,后者是LHS 为a, b 和RHS 的a+b 的并行赋值。请注意 RHS 的差异。

这两个等于:

(1)

a =  a+b
b =  a'   **

(2)

a =  a+b
b =  nil

但是,请注意,这一切都是一个操作。因此,在 (1) 情况下,它是 A' 而不是 A:使用 'a' 的 OLD VALUE,而不是刚刚分配的 'a+b' 的值 - 因为原始并行分配是一个操作,而不是两个操作就像我为了描述的目的在这里爆炸一样。

这意味着:

a,b = a+b, a

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

因为它是一个操作,并且因为它分配给两个值,所以会返回一个包含两个元素的数组 - 与执行单一分配并返回单个值相反。

如果你要执行三重赋值:

a,b,c,d,e,f  = 0,1,2,3,4,5

[0,1,2,3,4,5] 数组将是结果,a/b/c/d/e/f 将被分配 0/1/2/3/4/5分别取值。

有关更多信息,请参阅 Ruby 的并行赋值文档,也可能还有用于数组扩展和参数分组的 * 运算符

【讨论】:

实际上,'Quetzalcoatl' 是一个词:) 为了满足你的好奇心:(1) 不,很可能我在 Ruby 文档中读到过它,可能在语法/运算符部分的某个地方。我经常通过浏览语法/句法概述来接触新语言。 (2)我不使用 Ruby 来制作网站。我将它用作通用脚本语言。通常我用它制作临时工具。 (3)实际上,我的回答中很少有细节,只是一些一般性的提示。 (4) 与积分无关。是交换。今天我帮你,前几天有人帮你。 (5) 可能,全部。 (6)我不明白,对不起。 这些额外的问题完全是题外话,所以我会在两三天后删除我的评论。我建议你也这样做,只是为了让电路板远离噪音。【参考方案2】:

= 运算符允许使用逗号“并行”分配多个值。

例如:

a,b=1,2

a 分配给1,将b 分配给2

同样,

a,b=a+b,a

对于a=5b=4,这是:

a,b=5+4,5

这是:

a,b=9,5

因此,a 将被分配 9 和 b 5。

【讨论】:

谢谢Lindydancer!一个 *** 问题,如果你不介意的话。是什么让你回答了这个问题?我很难相信你这样做只是为了赚取积分,是吗? @ViktorKaufman,成为一名优秀的程序员不仅要写代码,还要教别人。我喜欢堆栈溢出,因为它是一种直接的问答形式(在其他论坛中,讨论往往会永远持续下去,并逐渐转移到离题的问题上)。分数和 cmets 确实很重要,但仅作为您制定答案的指导,总的分数通常不重要。【参考方案3】:

替换值可能更有意义。

a = 5
b = 4
a, b = a + b, a
a, b = [5 + 4], 5
a, b = [9, 5]

a, b = [a + b]
a, b = [a + b], nil # implicit nil
a, b = [5 + 4], nil

并行赋值相当于将右侧赋值给数组,然后将变量按顺序赋值给数组中具有该索引的项。

第二个示例中隐含 nil 的原因是 ruby​​ 查找不存在的数组索引的方式。

array = []
array[0] # nil

【讨论】:

感谢 Gazler 付出的时间和精力!【参考方案4】:

这是因为在第一个示例中,您将 b 的值设置为等于 a 的值

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

所以a=5+4 b=5

【讨论】:

以上是关于Ruby 奇数逗号与一系列变量一起使用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

csharp Switch语句就像流线条件一样。当您想要将单个变量与一系列const进行比较时,它们非常有用

面试官在“逗”你系列:数组去重你会几种呀?

面试官在“逗”你系列:数组去重你会几种呀?

统计js数组中奇数元素的个数

python中print()内,字符串相加‘,’和‘+’有啥区别?

如何将 regexp_substr() 与一组分隔符一起使用?