首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby语法糖的加法

Ruby语法糖的加法
EN

Stack Overflow用户
提问于 2013-04-07 07:45:23
回答 1查看 237关注 0票数 0

快速问一句,为什么这个不起作用?

代码语言:javascript
复制
sum = {}
e = "a"
(sum[e] ||= 0) += 1

我得到了(期待1):

代码语言:javascript
复制
SyntaxError: unexpected tOP_ASGN, expecting $end
(sum[e] ||= 0) += 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-07 07:48:33

执行(sum[e] ||= 0)时,圆括号会导致表达式求值。因此,它将计算为sum[e]的值(例如0),您不能对其执行+=操作。它不会像您预期的那样向sum[e]返回左值/引用。

您可以通过对结果执行相同的操作来验证这一点:

代码语言:javascript
复制
irb(main):001:0> 0 += 1
SyntaxError: (irb):1: syntax error, unexpected tOP_ASGN, expecting $end

或者像这样的东西:

代码语言:javascript
复制
irb(main):004:0> (sum[e]) += 1
SyntaxError: (irb):4: syntax error, unexpected tOP_ASGN, expecting $end

如果出于某种原因,您希望将其保留在一行中,则可以这样做:

代码语言:javascript
复制
sum[e] ||= 0; sum[e] += 1

正如dbenhur所提到的,如果您要经常这样做,您还可以为散列中的所有键设置一个默认值:

代码语言:javascript
复制
sum = Hash.new(0)

将sum设置为哈希,当您访问它时,每个键都会自动设置为0。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15857266

复制
相关文章

相似问题

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