Scala:在带有隐式参数的 nullary fn 调用上省略括号

Scala: omit brackets on nullary fn call with an implicit parameter

我有以下内容:

object POS {
  def apply()(implicit f: Foo): Int = ???
}

而且我可以通过我的代码中的 POS() 访问它。有什么方法可以修改这个,这样就不需要括号了,也就是说,我可以写 POS?

绝对不能只写POS,因为它指的是POS.type类型的单例对象POS。但是,如果仅使用隐式参数列表声明 apply,则在使用 POS.apply 调用它时可以省略括号。

更好的是,在某个地方定义 pos(implicit f: Foo) 函数,然后你可以通过写 pos:

来调用它
trait Foo {
  def foo: String
}
implicit object DefaultFoo extends Foo {
  def foo = "default..."
}

object POS {
  def apply(implicit f: Foo): Int = f.foo.size
  def pos(implicit f: Foo): Int = f.foo.size
}

println(POS.apply) // this works

{ 
  import POS._
  println(pos) // also works
}

实现类似效果的一种更模糊的方法是定义从 POS.typeInt 的隐式转换,它采用隐式 Foo 并调用 applyPOS:

import scala.language.implicitConversions

implicit def convertPosToInt(p: POS.type)(implicit f: Foo): Int = p.apply(f)

println("POS used in `Int` position: " + (2 * POS + 3))

(如果您想在定义中使用最后三行,请将 p.apply(f) 替换为 p.apply()(f);此版本适用于我上面的定义)。

POS.typeInt 的隐式转换的问题是它仍然必须处于需要 Int 才能发生转换的位置。如果您将 POS 用作独立语句,则不会发生任何转换。