我看到过 ?=>
符号出现在Scala代码和一些关于Scala 3的讨论帖中,所以我认为它是Scala 3+符号。在搜索文档或Google时没有找到任何结果,但它看起来像是对Function
类型的语法糖,所以也许与类型和函数有关。它是什么意思呢?
我看到过 ?=>
符号出现在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
的语法与正常的方法相同,它需要一个Foo
和Bar
作为隐式参数(在Scala 3中,使用blah(using bleh, bluh)
来显式地传递隐式参数bleh
和bluh
,而不是像在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)
我们还可以传入一个函数字面量。它没有普通参数,所以看起来有点像按名称的参数。由于字面量的 (Foo, Bar) ?=>
类型,因此可以使用 Foo
和 Bar
的隐式实例。
baz {
val foo = summon[Foo]
val bar = summon[Bar]
s"Function literal - foo: $foo, bar: $bar"
}
您还可以在函数文本本身中使用?=>
来命名隐式参数,而无需召唤它们并将其分配给值。由于它们是隐式的,因此您也可以从上面调用foobar
,因为有一个隐式的Foo
和Bar
可用(即使没有明确命名参数,您也可以在第二个示例中这样做)。
baz { (foo: Foo, bar: Bar) ?=>
val fromMethod = foobar
s"Explicit context function literal - foo: $foo, bar: $bar; $fromMethod"
}
Foo => Bar
是否与Foo ?=> Bar
相同? - IanContextFunction2[A, B]
。 - user