Scala,我可以将类构造函数参数(未定义为隐式)传递为隐式值吗?

时间:2018-06-20 19:00:13

标签: scala implicit

我是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”类定义,但这种做法严重干扰了我对实例化的约束。我希望我的双手不被绑在这里。

2 个答案:

答案 0 :(得分:2)

是的,您可以显式传递隐式参数

class HasPrefixInConstructor(suffix: String) {
    def thisWontCompile(): NeedsImplicitSuffix = {
        new NeedsImplicitSuffix("that")(suffix) // suffix is passed explicitly 
    }
}

Scala REPL

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

在任何范围内:类范围,方法范围,块。哪种方法更好,将取决于您的具体情况。

还有一点需要注意的是,不建议使用简单类型如IntString的隐式:太容易导致冲突。