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=5
和b=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进行比较时,它们非常有用