首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"(test1,test2,test3="3",test4="4",test5 = "5",test6 = "6")“做什么?

"(test1,test2,test3="3",test4="4",test5 = "5",test6 = "6")“做什么?
EN

Stack Overflow用户
提问于 2010-06-18 04:44:03
回答 3查看 217关注 0票数 3

这个问题是基于我最近在同事的工作中发现的一些非常奇怪的代码。他声称不知道它是如何工作的,只是他从其他地方抄袭来的。这对我来说还不够好,我想知道这里发生了什么。

如果我们有这样的东西:

代码语言:javascript
复制
(test1, test2, test3="3", test4="4")

结果将是test1 == "3"test2 == "4"test3 == niltest4 == "4"。我理解为什么会发生这种情况,但如果我们这样做:

代码语言:javascript
复制
(test1, test2, test3="3", test4="4", test5 = "5", test6 = "6")

现在结果是test1 == "3"test2 == "4"test3 == "5"test4 == "4"test5 == "5"test6 == "6"

为什么test5 == nil不是

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-18 04:54:04

它看起来像是这样执行的:

代码语言:javascript
复制
(test1, test2, test3) = ("3"), (test4 = "4"), (test5 = "5"), (test6 = "6")

# Equivalent:
test1 = "3"
test2 = test4 = "4"
test3 = test5 = "5"
      ; test6 = "6"
票数 3
EN

Stack Overflow用户

发布于 2010-06-18 05:15:39

赋值语句返回RHS (表达式的右侧),这是a = b = 4ab都设置为4的方式:

代码语言:javascript
复制
a = b = 4
-> a = (b = 4) // Has the "side effect" of setting b to 4
-> a = 4       // a is now set to the result of (b = 4)

记住这一点,以及Ruby允许在一条语句中进行多个赋值的事实,您的语句可以重写(Ruby看到逗号和等号,并认为您正在尝试进行多个赋值,第一个等号将LHS (左侧)和RHS分开):

代码语言:javascript
复制
test1, test2, test3="3", test4="4", test5 = "5", test6 = "6"
-> test1, test2, test3 = "3", (test4 = "4"), (test5 = "5"), (test6 = "6")

RHS首先被评估,这给我们留下了:

代码语言:javascript
复制
test1, test2, test3 = "3", "4", "5", "6"

副作用是将test4设置为"4",将test5设置为"5",将test6设置为"6"

然后评估LHS,并可以重写为:

代码语言:javascript
复制
test1 = "3"
test2 = "4"
test3 = "5"
// since there are 3 items on the LHS and 4 on the RHS, nothing is assigned to "6"

因此,在语句的末尾,将设置六个变量:

代码语言:javascript
复制
test1 == "3"
test2 == "4"
test3 == "5"
test4 == "4"
test5 == "5"
test6 == "6"
票数 2
EN

Stack Overflow用户

发布于 2010-06-18 05:23:29

当我运行你的第二个例子时:

代码语言:javascript
复制
(test1, test2, test3="3", test4="4", test5 = "5", test6 = "6")

我得到的结果与你报告的结果不同:

代码语言:javascript
复制
test1=="3", test2=="4", test3=="5", test4=="4", test5=="5", test6=="6"

(注意,test4是"4",而不是"6")

这对我来说很有意义,因为它是这样解析的:

代码语言:javascript
复制
((test1, test2, test3) = ("3", (test4="4", (test5 = "5", (test6 = "6")))))

所以你得到的评估是这样的:

代码语言:javascript
复制
((test1, test2, test3) = ("3", (test4="4", (test5 = "5", (test6 = "6")))))
[assign "6" to test6]
((test1, test2, test3) = ("3", (test4="4", (test5 = "5", "6"))))
[assign "5" to test5]
((test1, test2, test3) = ("3", (test4="4", "5", "6")))
[assign "4" to test4]
((test1, test2, test3) = ("3", "4", "5", "6"))
[assign "3", "4", and "5" to test1, test2, and test3 respectively]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3065488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档