繁体   English   中英

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

[英]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。请注意如何使用与将FooBar作为隐式参数的普通方法相同的语法调用xyzzy (在 Scala 3, blah(using bleh, bluh)用于显式传递隐式 arguments 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)

我们也可以传入一个 function 字面值。 没有常规参数,所以它看起来有点像名参数。 由于文字的(Foo, Bar)?=>类型,存在可用的FooBar的隐式实例。

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

您还可以在 function 文字本身中使用?=>来命名隐式参数,而不必调用它们并将它们分配给值。 由于它们是隐式的,您还可以从上面调用foobar ,因为隐式FooBar可用(尽管没有明确命名参数,您也可以在第二个示例中执行此操作)。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM