我有以下内容:
object POS {
def apply()(implicit f: Foo): Int = ???
}
我可以在我的代码中通过POS()
访问它。有没有办法修改这个以便不需要括号,即我可以写POS
?
答案 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.type
到Int
的隐式转换,它采用隐式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.type
到Int
的隐式转换问题是,它仍然必须处于转换发生所需Int
的位置。如果您使用POS
作为独立声明,则不会进行转换。