相关疑难解决方法(0)

Scala在哪里寻找暗示?

对Scala新手的一个隐含问题似乎是:编译器在哪里寻找隐含?我的意思是隐含的,因为这个问题似乎永远不会完全形成,好像没有它的话.:-)例如,integral下面的值来自哪里?

scala> import scala.math._
import scala.math._

scala> def foo[T](t: T)(implicit integral: Integral[T]) {println(integral)}
foo: [T](t: T)(implicit integral: scala.math.Integral[T])Unit

scala> foo(0)
scala.math.Numeric$IntIsIntegral$@3dbea611

scala> foo(0L)
scala.math.Numeric$LongIsIntegral$@48c610af
Run Code Online (Sandbox Code Playgroud)

对于那些决定学习第一个问题的答案的人来说,另一个问题是,在某些明显模糊的情况下(但无论如何编译),编译器如何选择使用哪个隐式?

例如,scala.Predef定义两个转换String:一个转换为WrappedString另一个转换为StringOps.然而,这两个类都有很多方法,所以为什么Scala不会在调用时抱怨歧义map

注意:这个问题的灵感来自另一个问题,希望以更一般的方式陈述问题.该示例是从那里复制的,因为它在答案中被引用.

scala implicit-conversion implicits

389
推荐指数
2
解决办法
4万
查看次数

(case)类构造函数的上下文中的隐式转换

我想让applycase类的自动伴侣类构造函数为我执行隐式转换,但无法弄清楚如何这样做.我一直在搜索,我能找到的最接近的答案就是这个问题(我将解释为什么它不是我正在寻找的).

我有一个类似于下面的案例类:

case class Container(a: Long, b: Long, c: Long)
Run Code Online (Sandbox Code Playgroud)

我正在使用容器来计算某些条件适用的实例,所以我希望能够让构造函数自动将布尔参数转换为longs(if (boolean) 1L else 0L).

当然,真实的案例类有很多参数,因此制作我自己的伴随对象和重载apply接受Boolean参数会很繁琐且非常重复.此外,类似下面的代码是不理想的(如果它以某种方式正确实现),因为它只接受布尔参数:

object Container {
  def apply(args: Boolean*) = {
    // doesn't REALLY work since number of arguments not enforced
    Container(args map { if (_) 1L else 0L } toArray: _*)
  }
}
val c1 = Container(1, 0, 1) // works
val c2 = Container(true, false, true) // might be workable if done correctly
val c3 …
Run Code Online (Sandbox Code Playgroud)

scala implicit implicit-conversion

7
推荐指数
1
解决办法
2607
查看次数

标签 统计

implicit-conversion ×2

scala ×2

implicit ×1

implicits ×1