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

时间:2018-02-07 16:19:35

标签: scala implicit

我有以下内容:

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

我可以在我的代码中通过POS()访问它。有没有办法修改这个以便不需要括号,即我可以写POS

1 个答案:

答案 0 :(得分:2)

你绝对不能只写POS,因为它引用了POS类型的单一对象POS.type。但是,如果仅使用隐式参数列表声明POS.apply,则可以在使用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并在apply上调用POS {1}}:

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作为独立声明,则不会进行转换。