增加和获得价值

Posted

技术标签:

【中文标题】增加和获得价值【英文标题】:Incrementing and getting value 【发布时间】:2013-01-25 16:38:18 【问题描述】:

简单的 scala 问题。请考虑以下内容。

scala> var mycounter: Int = 0;
mycounter: Int = 0

scala> mycounter += 1

scala> mycounter
res1: Int = 1

在第二个语句中,我增加了我的计数器。但是什么都没有返回。如何在一个语句中递增和返回某些内容。

【问题讨论】:

你没有。作为一般规则,副作用方法或表达式不会返回有趣的值,只会返回Unit @Randall Schulz 关于副作用的好观点。 【参考方案1】:

使用'+='return Unit,所以你应该这样做:

 mycounter += 1; mycounter 

你也可以使用闭包来解决这个问题(因为函数参数是 val):

scala> var x = 1
x: Int = 1

scala> def f(y: Int) =  x += y; x
f: (y: Int)Int

scala> f(1)
res5: Int = 2

scala> f(5)
res6: Int = 7

scala> x
res7: Int = 7

顺便说一句,您可以考虑改用不可变值,并采用这种编程风格,那么您的所有语句都会返回一些东西;)

【讨论】:

好帖子。但就我而言,我使用的是计数器,这意味着我无法使其完全不可变。 我很确定你可以,你介意与完整的用例分享一个馅饼吗? 哦,好吧,演员中的变异状态(看到你对其他帖子的评论),那么绝对有意义。 这些年来 Scala 有什么变化吗?我能够做这篇文章撰写时 OP 无法做的事情。编辑:我正在运行“Scala 版本 2.11.7(Java HotSpot(TM) 64 位服务器 VM,Java 1.8.0_45)”【参考方案2】:

Assignment 是一个计算为 Unit 的表达式。背后的推理可以在这里找到:What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?

在 Scala 中,这通常不是问题,因为您要解决的问题可能有不同的构造。

我不知道您的确切用例,但如果您想使用增量,它可能采用以下形式:

(1 to 10).foreach  i => 
  // do something with i

【讨论】:

我的确切情况是我有一个封装了计数器的 Actor。每次发送消息时,它的价值都会增加。 我明白了,这是var 的好地方。在这种情况下,您可以按照 Alois Cochard 的建议创建一个方法:def increment:Int = counter += 1; counter 【参考方案3】:

有时我会这样做:

val nextId =  var i = 0; () =>  i += 1; i 
println(nextId())                               //> 1
println(nextId())                               //> 2

如果您需要一些时间来访问值而不递增,则可能不适合您。

【讨论】:

以上是关于增加和获得价值的主要内容,如果未能解决你的问题,请参考以下文章

Amcharts - 增加图例名称和价值之间的差距

对程序员来说,ACP证书价值?

如何在文档库列中增加价值

Alamofire 和 SwiftyJSon 在请求函数之外获得价值

jQuery val();没有获得价值

如何获得 INNER Join 价值