在Scala中?=>;是什么意思? [英] What does ?=> mean in Scala?
本文介绍了在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
的语法与将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"
}
这篇关于在Scala中?=>;是什么意思?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文