在Scala中?=>是什么意思? [英] What does ?=> mean in Scala?

查看:28
本文介绍了在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)

我们还可以传入函数文字。没有常规参数,因此它看起来有点像按名称的参数。由于文本的(Foo, Bar) ?=>类型,有FooBar的隐式实例可用。

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"
}

这篇关于在Scala中?=>是什么意思?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆