scala - 值类引入了不需要的公共(public)方法

标签 scala visibility named-parameters value-class

查看我的库的一些 scala 文档,在我看来,值类中有一些不需要的噪音。例如:

implicit class RichInt(val i: Int) extends AnyVal {
  def squared = i * i
}

这引入了一个不需要的符号 i :
4.i   // arghh....

这些东西出现在 scala 文档和 IDE 自动完成中,这确实不好。

那么......关于如何缓解这个问题的任何想法?我的意思是你可以使用 RichInt(val self: Int)但这并没有让它变得更好( 4.self ,wth?)

编辑 :

在以下示例中,编译器是否删除中间对象?
import language.implicitConversions

object Definition {
  trait IntOps extends Any { def squared: Int }
  implicit private class IntOpsImpl(val i: Int) extends AnyVal with IntOps {
    def squared = i * i
  }
  implicit def IntOps(i: Int): IntOps = new IntOpsImpl(i)  // optimised or not?
}

object Application {
  import Definition._
  // 4.i  -- forbidden
  4.squared
}

最佳答案

在 Scala 2.11 中,您可以将 val 设为私有(private),从而解决此问题:

implicit class RichInt(private val i: Int) extends AnyVal {
  def squared = i * i
}

关于scala - 值类引入了不需要的公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17944356/

相关文章:

scala - 了解 Spark 监控 UI

html - 使列表元素在移动设备上不可见(响应式)

groovy - groovy 中具有默认值的命名参数

flutter - Dart 中命名参数和位置参数有什么区别?

scala - 从选项中的类型方法生成部分应用的函数

scala - 如何在spark数据框中用\N替换空字符串

javascript - 我的 html css 程序中的可见性问题

ios - Xamarin iOS UIButton 隐藏/显示

javascript - 在 node.js 中使用命名参数

scala - 为什么 IntelliJ 在以编程方式实现方法 stub 时默认覆盖每个方法?