[英]What does ?=> mean in Scala?
我已经看到?=>
符号出现在 Scala 代码和一些关于 Scala 3 的讨论帖子中,所以我假设它是一个 Scala 3+ 符号。 通过文档或谷歌搜索时没有任何内容,但它看起来像是Function
类型的语法糖,所以它可能与类型和函数有关。 这是什么意思?
类型(a: A, b: B, ..., z: Z)?=> R
基本上意味着(using a: A, b: B, ..., z: Z) => R
(我相信后一种语法在某一时刻有效,但不再有效)。 当您使用?=>
时,所有这些参数都成为隐式参数。 类似地,function 文字(a, b, ..., z)?=>...
使 function 的所有参数都是隐式的,以后可以将它们隐式地传递给其他方法。
这是一个例子( 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
采用上下文 function。请注意如何使用与将Foo
和Bar
作为隐式参数的普通方法相同的语法调用xyzzy
(在 Scala 3, blah(using bleh, bluh)
用于显式传递隐式 arguments 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)
我们也可以传入一个 function 字面值。 没有常规参数,所以它看起来有点像名参数。 由于文字的(Foo, Bar)?=>
类型,存在可用的Foo
和Bar
的隐式实例。
baz {
val foo = summon[Foo]
val bar = summon[Bar]
s"Function literal - foo: $foo, bar: $bar"
}
您还可以在 function 文字本身中使用?=>
来命名隐式参数,而不必调用它们并将它们分配给值。 由于它们是隐式的,您还可以从上面调用foobar
,因为隐式Foo
和Bar
可用(尽管没有明确命名参数,您也可以在第二个示例中执行此操作)。
baz { (foo: Foo, bar: Bar) ?=>
val fromMethod = foobar
s"Explicit context function literal - foo: $foo, bar: $bar; $fromMethod"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.