gpt4 book ai didi

scala - 奇怪的Scala语法,其中映射Future以便 “==”和 “!=”仅出现一个操作数(而不是两个)

转载 作者:行者123 更新时间:2023-12-02 08:05:09 38 4
gpt4 key购买 nike

我遇到了一个令人费解但有趣的代码构造,我仔细研究了一个小例子,
我仍然很难缠头。

该示例如下所示。请注意,我有一个简单的Future,可以立即返回String。我映射这个
使用!=和==比较Future本身

import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._

object Dummy extends App {
val taskReturningString: Future[String] = Future{ "foo"}

val falseResult: Future[Boolean] = taskReturningString.map(taskReturningString ==)
System.out.println("false result:" + Await.result(falseResult, 0 nanos) )

val trueResult: Future[Boolean] = taskReturningString.map(taskReturningString !=)
System.out.println("true result:" + Await.result(trueResult, 0 nanos) )
}

输出是
    false result:false
true result:true

但是我不确定为什么能得到这些结果。在==和!=的情况下,要比较的第一项是
'taskReturningString'- future 但是,与之相比呢?我假设发生了什么
是一个比较,但我从未见过这样的情况:运算符==和!=出现一个操作数而不是两个操作数。

最佳答案

该行为归因于eta expansion。这些map需要一个函数String => Boolean(因为类型推断),而taskReturningString ==是可以扩展为该函数的方法。

这是一个简化的示例。

val equals: String => Boolean = "foo" ==

println(equals("foo"))
// true

println(equals("bar"))
// false

或使用 +
val plusTwo: Int => Int = 2 +
println(plusTwo(2))
// 4
drop中的 String
val drop: Int => String =  "abcd".drop
println(drop(2))
// cd

或列表中的 :::
val concat: List[Int] => List[Int] = List(1,2,3) :::
println(concat(List(4,5,6)))
// List(4,5,6,1,2,3)

如果编译器意识到_可以扩展缺少参数的方法并且类型正确,则不一定总是使用_。

该代码不起作用,因为编译器无法知道 equals的类型
val equals = "foo" ==

所以我需要用 _帮助它
val equals = "foo" == _

关于scala - 奇怪的Scala语法,其中映射Future以便 “==”和 “!=”仅出现一个操作数(而不是两个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435857/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com