gpt4 book ai didi

scala - 到 StringOps 的隐式转换未在隐式 val 函数体内应用

转载 作者:行者123 更新时间:2023-12-04 16:05:57 25 4
gpt4 key购买 nike

在下面的代码片段中(使用 scala 2.10.3)TestClass1 没有编译错误“value toInt is not a member of String”但是 TestClass2 编译良好:

trait TestTrait {
implicit def test: (String => Int)
}

object TestClass1 extends TestTrait {
implicit val test = (value: String) => value.toInt
}

object TestClass2 extends TestTrait {
implicit def test = (value: String) => value.toInt
}

通过 augmentString()StringOps 隐式转换,它提供了 toInt 功能,在 TestClass1 但在 TestClass2 中应用良好。谁能告诉我为什么会这样,以及如何让 test 保持 val 而不是 def

最佳答案

我认为这是在需要推断返回类型时隐式定义的限制。您处于与定义递归方法有些相似的情况。也就是说,“开放”的隐式定义在其主体中触发隐式查找,理论上可以递归。 (至少这是我对此限制的解释)。

您可以注释类型:

object TestClass1 extends TestTrait {
implicit val test: String => Int = value => value.toInt // or _.toInt
}

或者删除implicit关键字——因为它是从TestTrait实现隐式方法,你不需要重新声明implicit关键词:

object TestClass1 extends TestTrait {
val test = (value: String) => value.toInt
}

关于scala - 到 StringOps 的隐式转换未在隐式 val 函数体内应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19359726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com