在 Scala 中 ?=> 是什么意思?
What does ?=> mean in 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
采用上下文函数。请注意如何使用与将 Foo
和 Bar
作为隐式参数的普通方法相同的语法调用 xyzzy
(在 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 代码和一些关于 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
采用上下文函数。请注意如何使用与将 Foo
和 Bar
作为隐式参数的普通方法相同的语法调用 xyzzy
(在 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"
}