小编Pet*_*itz的帖子

特征继承与<:

我习惯于从这样的特征继承:

trait A
trait B extends A
Run Code Online (Sandbox Code Playgroud)

但最近我偶然发现它也有可能<::

trait A
trait B <: A
Run Code Online (Sandbox Code Playgroud)

为什么?动机是什么?(不想听到它在规格中的记录.)当一个班级发挥作用时是不可能的.

inheritance scala traits

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

将特征混合到一个包对象中两次

虽然这按预期工作:

trait A
trait B extends A
object C extends A with B
Run Code Online (Sandbox Code Playgroud)

以下产量illegal cyclic reference involving trait B:

package cyclictest {
  trait A
  trait B extends A
}
package object cyclictest extends A with B
Run Code Online (Sandbox Code Playgroud)

那里发生了什么?

scala

6
推荐指数
1
解决办法
516
查看次数

获取简单的远程Akka应用程序运行

我试图建立一个简单的服务器/客户端akka(使用Akka 2.0.3)应用程序,但它无法连接.这里预先是基本代码:

import com.typesafe.config.ConfigFactory
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props

class Server extends Actor {
  def receive = {
    case s: String => println("Got " + s)
  }
}

val serverSystem = ActorSystem("server", ConfigFactory.load(ConfigFactory.parseString("""
  akka {
    actor {
      provider = "akka.remote.RemoteActorRefProvider"
    }
    remote {
      transport = "akka.remote.netty.NettyRemoteTransport"
      netty {
        hostname = "localhost"
        port = 5678
      }
    }
  }
""")))

val server = serverSystem.actorOf(Props[Server], name = "server")
Thread.sleep(500)
println("started")
Thread.sleep(500)

val clientSystem = ActorSystem("client", ConfigFactory.load(ConfigFactory.parseString("""
  akka {
    actor {
      provider = …
Run Code Online (Sandbox Code Playgroud)

scala akka

6
推荐指数
1
解决办法
2254
查看次数

用于颜色和字体的Eclipse快捷键 - >基本 - >文本字体

我经常更改编辑器的字体大小.那么有人知道一个快捷键吗?到目前为止,我只需点击几下即可使用菜单:首选项 - >颜色和字体 - >基本 - >文本字体.可以使用CTRL+ MouseWheel很好...

eclipse keyboard-shortcuts

5
推荐指数
1
解决办法
4157
查看次数

明确的Subimplicits

请考虑以下代码:

class A { def print = println("A") }
class B extends A { override def print = println("B") }

def foo(implicit a: A) = a.print

def bar(implicit a: A) = {
  implicit val b = new B
  foo
}

bar(new A) // B
Run Code Online (Sandbox Code Playgroud)

我很奇怪,为什么呼吁foobar不提出一个ambiguous implicit values错误.当然

implicit val b: A = new B
Run Code Online (Sandbox Code Playgroud)

会引起这个错误.为什么foo选择隐式b而非隐式a?或者甚至更一般:将采取什么规则?

编辑:
由于我与Ivan的评论 - 我想澄清:如果我以与隐式方法参数相同的方式命名本地隐式val,我会知道我的问题的答案.

def bar(implicit a: A) = {
  implicit val a …
Run Code Online (Sandbox Code Playgroud)

scala implicit

5
推荐指数
1
解决办法
108
查看次数

隐式转换不起作用

为什么不应用以下隐式方法?并且我如何实现自动将实例转换为具有隐含范围X的实例.YConversion[X,Y]

trait Conversion[X, Y] {
  def apply(x: X): Y
}
implicit object Str2IntConversion extends Conversion[String, Int] {
  def apply(s: String): Int = s.size
}
implicit def convert[X, Y](x: X)(implicit c: Conversion[X, Y]): Y = c(x)

val s = "Hello"
val i1: Int = convert(s)
val i2: Int = s // type mismatch; found: String  required: Int
Run Code Online (Sandbox Code Playgroud)

scala implicit-conversion

5
推荐指数
1
解决办法
289
查看次数

编译期间有关未处理类型类的警告

给出以下最小代码:

package object MyPackage {
  case class Pimp(private val i: Int) extends AnyVal 
}
Run Code Online (Sandbox Code Playgroud)

SBT(0.13.8)抱怨:

[warn] sbt-api: Unhandled type class scala.reflect.internal.Types$MethodType : ($this: myPackage.package.Pimp)Int
Run Code Online (Sandbox Code Playgroud)

我的构建文件大致如下:

Project("sbtissue", file("sbtissue")).settings(scalaVersion := "2.11.6")
Run Code Online (Sandbox Code Playgroud)

将源文件中的相关行更改为:

class Pimp(private val i: Int) extends AnyVal
Run Code Online (Sandbox Code Playgroud)

要么:

case class Pimp(i: Int) extends AnyVal
Run Code Online (Sandbox Code Playgroud)

编译时不会发出警告.我该怎么做才能防止这种警告?

相关:https://groups.google.com/forum/#!topic/simple-build-tool/KWdg4HfYqMk

scala sbt

5
推荐指数
1
解决办法
229
查看次数

路径依赖类型是子类型吗?

trait A {
  trait B {
    def foo: A.this.B = new B{}
    def bar: A#B      = foo 
    def baz: A.this.B = bar // type mismatch; found : A#B required: A.this.B 
  }
}
Run Code Online (Sandbox Code Playgroud)

我是对的,这A.this.B是一种路径依赖型?!(这是我到目前为止的理解)上面的例子是否意味着类型A.this.B 是一个子类型 A#B?(如果是的话,我猜不同的是,一个实例A.this.B有一个A对比实例的引用A#B没有?)有没有人知道一个有启发性的解释来解决我对这两种类型的困惑?

scala path-dependent-type

3
推荐指数
2
解决办法
1044
查看次数

将Scala演员转变为Akka演员:一个实例调用方法

最近我从scala演员切换到akka演员,但注意到akka演员使用ActorRef而不是实例对象:

val actorRef: ActorRef = Actor.actorOf(new MyActor)
Run Code Online (Sandbox Code Playgroud)

所以我尝试过:

val myActor = new MyActor
val actorRef: ActorRef = Actor.actorOf(x)
Run Code Online (Sandbox Code Playgroud)

...同时拥有:1)ActorRef发送消息和2)MyActor调用方法.
但我得到了:

akka.actor.ActorInitializationException: ActorRef for instance of actor [MyActor] is not in scope.
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:我如何获得一个我可以调用的实例(某种类型)ActorRef- 像!AND这样的方法来自MyActor实例的方法?

scala actor akka

3
推荐指数
1
解决办法
973
查看次数

键入Class和Subclassing

假设我有一个类型类:

trait ToString[T] {
  def toString(t: T): String
}
Run Code Online (Sandbox Code Playgroud)

以下皮条客:

implicit def ToStr[T: ToString](t: T) = new {
  def toStr: String = implicitly[ToString[T]] toString t
}
Run Code Online (Sandbox Code Playgroud)

现在让我们测试一下:

class A
implicit object AToString extends ToString[A] {
  def toString(a: A) = "A"
}
(new A).toStr // A
Run Code Online (Sandbox Code Playgroud)

很好,到目前为止.但是,如果我介绍了一个子类BA:

class B extends A
(new B).toStr // could not find implicit value for evidence parameter of type ToString[B]
Run Code Online (Sandbox Code Playgroud)

所以我尝试过:

implicit def foo[X: ToString, Y <: X]: ToString[Y] = new ToString[Y] …
Run Code Online (Sandbox Code Playgroud)

scala typeclass

3
推荐指数
1
解决办法
1231
查看次数

如何使用适当的apply方法将对象隐式转换为函数?

正如问题所说我正在尝试以下(不编译):

  object O {
    def apply(i: Int): Boolean = i % 2 == 0
  }
  val f: Int => Boolean = O
Run Code Online (Sandbox Code Playgroud)

所以我尝试了这个:

  implicit def apply2Fct[A,B](applier: { def apply(a: A): B }) = {
    new Function[A,B] { def apply(a: A): B = applier(a) }
  }
Run Code Online (Sandbox Code Playgroud)

但是编译器抱怨"结构细化中的参数类型可能不会引用在该细化之外定义的抽象类型".

编辑:

由于Jean-Philippe Pellet的回答,我不得不提到我不能分别O延长.Function[A,B]Function[Int,Boolean]

scala

2
推荐指数
1
解决办法
445
查看次数

隐含范围

作为我的其他问题的后续内容,请参阅代码中的注释/问题:

case class Implicit(name: String)

def foo(implicit i: Implicit = null) = println(Option(i))

def bar1(implicit i: Implicit) {
  foo // prints None
  implicit val i = Implicit("J") // Why is call to foo above affected although this line comes after?
  foo // prints Some(Implicit(I))
}

def bar2(implicit i: Implicit) {
  foo // prints None
  implicit val i = null
  implicit val j = Implicit("J")
  foo // prints None // Why? Should raise ambiguous implicits or at least choose …
Run Code Online (Sandbox Code Playgroud)

scope scala implicit

2
推荐指数
1
解决办法
508
查看次数

类型细化

我该如何进行以下工作?

trait T {
  type I <: T
  def apply(i: I): I
}

class Foo[T0 <: T](t: T0) {
  def bar(x: T0) = t(x)
}
implicit def tofoo[T0 <: T](t: T0) = new Foo(t)
Run Code Online (Sandbox Code Playgroud)

bar行产生错误:

type mismatch; found : x.type (with underlying type T0) required: Foo.this.t.I
Run Code Online (Sandbox Code Playgroud)

(有人可能会说,为什么皮条客和具有bar做同样的applyT,但it's因为我减少了问题,在我工作的代码我有一个序列[T]作为一个参数bar.)

编辑:

由于@AlexeyRomanov的答案,我展示了一个例子(也从工作代码中减少了)也应该有效:

trait T {
  type I <: T
  def apply(i: I): I
}

class Foo[T0 <: T { type I = T0 …
Run Code Online (Sandbox Code Playgroud)

types scala

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