我是Scala的新手,请多多包涵。
class NeedsImplicitSuffix(prefix: String)(implicit suffix: String) {
def doImplicitly(): String = {
s"$prefix-$suffix"
}
}
class HasPrefixInConstructor(suffix: String) {
def thisWontCompile(): NeedsImplicitSuffix = {
new NeedsImplicitSuffix("that")
}
}
如果我在控制台(或IDE)中尝试此操作,则会出现以下错误。
error: could not find implicit value for parameter suffix: String
我可以在方法thisWontCompile
的上下文中访问字符串suffix
并使其可以作为隐式值传递吗?我认识到,在Scala中执行此操作的规范方法是重新定义“ HasPrefixInConstructor”类定义,但这种做法严重干扰了我对实例化的约束。我希望我的双手不被绑在这里。
答案 0 :(得分:2)
是的,您可以显式传递隐式参数
class HasPrefixInConstructor(suffix: String) {
def thisWontCompile(): NeedsImplicitSuffix = {
new NeedsImplicitSuffix("that")(suffix) // suffix is passed explicitly
}
}
scala> case class A(a: Int)(implicit b: String)
defined class A
scala> class B(b: String) {
| def foo: A = A(1)(b)
| }
defined class B
scala>
答案 1 :(得分:2)
@pamu答案的替代方法:您也可以声明
implicit val suffix1: String = suffix
在任何范围内:类范围,方法范围,块。哪种方法更好,将取决于您的具体情况。
还有一点需要注意的是,不建议使用简单类型如Int
或String
的隐式:太容易导致冲突。