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.type
到 Int
的隐式转换,它采用隐式 Foo
并调用 apply
在 POS
:
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
用作独立语句,则不会发生任何转换。
我有以下内容:
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.type
到 Int
的隐式转换,它采用隐式 Foo
并调用 apply
在 POS
:
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
用作独立语句,则不会发生任何转换。