【问题标题】:Scala, can I pass a class constructor parameter (not defined as implicit) as an implicit value?Scala,我可以将类构造函数参数(未定义为隐式)作为隐式值传递吗?
【发布时间】:2018-06-20 19:00:12
【问题描述】:

我是 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”类定义,但这严重混淆了我对实例化的约束。我希望我的手不会被束缚在这里。

【问题讨论】:

    标签: scala implicit


    【解决方案1】:

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

    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>
    

    【讨论】:

      【解决方案2】:

      @pamu 答案的替代方案:您也可以只声明

      implicit val suffix1: String = suffix
      

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

      作为补充说明,不鼓励使用 IntString 等简单类型的隐式:很容易以冲突告终。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-28
        • 1970-01-01
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        相关资源
        最近更新 更多