在 Scala 中 ?=> 是什么意思?



我看到?=>符号出现在Scala代码和一些关于Scala 3的讨论帖子中,所以我假设它是Scala 3+符号。在文档或Google中搜索时什么也没有出现,但它看起来像是Function类型的语法糖,所以它可能与类型和函数有关。这是什么意思?

类型(a: A, b: B, ..., z: Z) ?=> R基本上意味着(using a: A, b: B, ..., z: Z) => R(我相信后一种语法在某一点上是有效的,但不再有效了)。当您使用?=>时,所有这些参数都变成隐式参数。类似地,函数字面量(a, b, ..., z) ?=> ...使该函数的所有形参都隐式地传递,这些形参可以稍后隐式地传递给其他方法。

下面是一个示例(Scastie):

case class Foo(s: String)
case class Bar(i: Int)
def baz(xyzzy: (Foo, Bar) ?=> String): Unit =
val foo = Foo("waldo")
val bar = Bar(2)
println(xyzzy(using foo, bar))

baz接受一个上下文函数。请注意xyzzy是如何以与普通方法相同的语法调用的,以FooBar作为隐式参数(在Scala 3中,blah(using bleh, bluh)用于显式传递隐式参数blehbluh,而不是像Scala 2中那样简单地传递blah(bleh, bluh))。

这里有一种方法可以调用baz,通过定义一个带隐式参数的方法:
def foobar(using Foo, Bar) =
val foo = summon[Foo]
val bar = summon[Bar]
s"Method - foo: $foo, bar: $bar"
baz(foobar)

也可以传入函数字面量。没有常规参数,所以它看起来有点像按名称的参数。有FooBar的隐式实例可用,因为文字的(Foo, Bar) ?=>类型。

baz {
val foo = summon[Foo]
val bar = summon[Bar]
s"Function literal - foo: $foo, bar: $bar"
}

您还可以在函数字面量本身中使用?=>来命名隐式形参,而不必调用它们并将它们赋值。由于它们是隐式的,您也可以从上面调用foobar,因为隐式的FooBar是可用的(您也可以在第二个示例中这样做,尽管没有显式地命名参数)。

baz { (foo: Foo, bar: Bar) ?=>
val fromMethod = foobar
s"Explicit context function literal - foo: $foo, bar: $bar; $fromMethod"
}

最新更新