我见过一个implicitly在Scala示例中使用的函数.它是什么,它是如何使用的?
scala> sealed trait Foo[T] { def apply(list : List[T]) : Unit }; object Foo {
| implicit def stringImpl = new Foo[String] {
| def apply(list : List[String]) = println("String")
| }
| implicit def intImpl = new Foo[Int] {
| def apply(list : List[Int]) = println("Int")
| }
| } ; def foo[A : Foo](x : List[A]) = implicitly[Foo[A]].apply(x)
defined trait Foo
defined module Foo
foo: [A](x: List[A])(implicit evidence$1: Foo[A])Unit
scala> foo(1)
<console>:8: error: …Run Code Online (Sandbox Code Playgroud) pimp-my-library模式允许我通过提供从该类到实现该方法的类的隐式转换,似乎向类添加方法.
斯卡拉不允许两个这样的隐式转换正在发生,但是,我不能得到A到C使用隐含A于B和另一个隐含的B对C.有没有办法解决这个限制?
如果我没有导入除Scala通常默认值之外的任何内容,那么范围内有多少含义(隐式转换)?
是否有完整的列表,最好按照他们可以采取行动的类型进行组织?
我已经阅读了关于scala.math.Integral的问题的答案但是我不明白当作为隐式参数传递时会发生什么.(我想我一般都理解隐式参数概念).Integral[T]
让我们考虑一下这个功能
import scala.math._
def foo[T](t: T)(implicit integral: Integral[T]) { println(integral) }
Run Code Online (Sandbox Code Playgroud)
现在我打电话给fooREPL:
scala> foo(0)
scala.math.Numeric$IntIsIntegral$@581ea2
scala> foo(0L)
scala.math.Numeric$LongIsIntegral$@17fe89Run Code Online (Sandbox Code Playgroud)
怎样的integral争论变得scala.math.Numeric$IntIsIntegral和scala.math.Numeric$LongIsIntegral?
假设我们只有局部范围的隐式参数查找:
trait CanFoo[A] {
def foos(x: A): String
}
object Def {
implicit object ImportIntFoo extends CanFoo[Int] {
def foos(x: Int) = "ImportIntFoo:" + x.toString
}
}
object Main {
def test(): String = {
implicit object LocalIntFoo extends CanFoo[Int] {
def foos(x: Int) = "LocalIntFoo:" + x.toString
}
import Def._
foo(1)
}
def foo[A:CanFoo](x: A): String = implicitly[CanFoo[A]].foos(x)
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,LocalIntFoo胜过ImportedIntFoo.有人可以使用"静态重载决策规则(§6.26.3)"来解释它是如何被认为更具体的吗?
编辑:
名称绑定优先级是一个引人注目的参数,但有几个问题尚未解决.首先,Scala语言参考说:
如果有几个符合条件的参数与隐式参数的类型匹配,则将使用静态重载决策的规则(第6.26.3节)选择最具体的参数.
其次,名称绑定优先级是关于在范围内有多个变量/方法/对象的情况下解析x特定成员的已知标识符.并且没有相同的名称.pkg.A.B.xxImportIntFooLocalIntFoo
第三,我可以证明单独的 …
如何在Scala项目中组织代码?
经过多年的Java开发(大部分时间都使用Spring),我们试图在Scala中提出一个快速原型.
弹出的第一个问题之一是:我们基本上只使用相同的软件包名称和代码组织,只是在Scala中编写代码吗?
例如,我们曾经有过的助手为我们的实体(AccountHelper,CacheHelper ...),也有时我们使用的服务太(帐户服务...).
ot:更远的地方我们还将研究如何将我们的maven子模块移植到sbt,但这完全是另一回事.
我已经编写了一些隐式代码,如下所示,我想知道为什么i2d不调用函数隐式对话.
object Test {
implicit def i2d(x: Int): Double = {
println("foo")
x.toDouble
}
implicit def d2i(x: Double): Int = {
x.toInt
}
val x: Int = 10
val y: Double = x
val z: Int = 3.5
}
Run Code Online (Sandbox Code Playgroud)
该输出的scalac -Xprint:typer Test.scala
// Test.scala
[[syntax trees at end of typer]]
package <empty> {
object Test extends scala.AnyRef {
def <init>(): Test.type = {
Test.super.<init>();
()
};
implicit def i2d(x: Int): Double = {
scala.this.Predef.println("foo");
x.toDouble …Run Code Online (Sandbox Code Playgroud) 在Java中,我会做类似的事情
class MyDate extends java.util.Date {
public String toString() { ... }
}
MyDate date = new MyDate
Run Code Online (Sandbox Code Playgroud)
有点笨重.在Scala中,是否可以覆盖toString,同时仍然使用常规的java.util.Date而不是MyDate.我有一个暗示涉及但很乐意使用任何技术
我正在试图弄清楚如何为Scala抽象类型调用构造函数:
class Journey(val length: Int)
class PlaneJourney(length: Int) extends Journey(length)
class BoatJourney(length: Int) extends Journey(length)
class Port[J <: Journey] {
def startJourney: J = {
new J(23) // error: class type required but J found
}
}
Run Code Online (Sandbox Code Playgroud)
这甚至可行吗?我熟悉Scala清单,但我不清楚它们如何在这里提供帮助.同样,我无法弄清楚如何对伴侣对象的apply()构造函数做同样的事情:
object Journey { def apply() = new Journey(0) }
object PlaneJourney { def apply() = new PlaneJourney(0) }
object BoatJourney { def apply() = new BoatJourney(0) }
class Port[J <: Journey] {
def startJourney: J = {
J() // error: …Run Code Online (Sandbox Code Playgroud)