小编agi*_*eel的帖子

继承一个特征两次

这不起作用:

trait Trait
class Class extends Trait with Trait
Run Code Online (Sandbox Code Playgroud)

编译抱怨:

<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                           ^
<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                                      ^
Run Code Online (Sandbox Code Playgroud)

这样做:

trait Trait
class Abstraction extends Trait
class Implementation extends Abstraction with Trait
Run Code Online (Sandbox Code Playgroud)

问题:

  • 它为什么有效?
  • 第二个片段有何不同?(关于双重继承问题)
  • 第二个片段或模式是否有用?

inheritance scala linearization

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

如何为一系列任务添加别名?

我在SBT(0.12.2)项目中有自定义任务.让我们给他们打电话a,bc.因此,当我处于SBT的交互模式时,我只需键入a并执行与之关联的任务a.我也可以打字;a;b;c,三个任务按顺序执行; 就像;clean;compile会做的那样.我还可以从交互式shell中创建一个别名来运行它们:alias all=;a;b;c.现在,当我输入all任务时,以明显的方式执行.我想要实现的是在我的项目的SBT配置中创建这个别名.

SBT文档的这一部分涉及任务,但我能实现的是这样的:

lazy val a = TaskKey[Unit]("a", "does a")
lazy val b = TaskKey[Unit]("b", "does b")
lazy val c = TaskKey[Unit]("c", "does c")
lazy val all = TaskKey[Unit]("all", ";a;b;c")

lazy val taskSettings = Seq(
    all <<= Seq(a,b,c).dependOn
)
Run Code Online (Sandbox Code Playgroud)

我对这种方法的问题在于,任务被组合在一起,因此它们的执行是顺序发生的,与顺序相反,这正是我想要实现的.那么如何alias all=;a;b;c在SBT配置文件中创建一个别名呢?

scala sbt

17
推荐指数
3
解决办法
4758
查看次数

在Scala中使用地图上的收集

我最近偶然发现了这篇文章,它"介绍"了collectScala集合的方法.用法很简单:

scala> val ints = List(1, "2", 3) collect { case i: Int => i }
ints: List[Int] = List(1, 3)
Run Code Online (Sandbox Code Playgroud)

现在,映射基本上是键值对的列表,它们由Scala中的元组表示.所以你可能想尝试这样的事情:

scala> val pairs = Map(1 -> "I", "II" -> 2)
pairs: scala.collection.immutable.Map[Any,Any] = Map(1 -> I, II -> 2)

scala> val intsToStrings = pairs collect { case pair: (Int, String) => pair }
Run Code Online (Sandbox Code Playgroud)

编译器当然抱怨由于JVM的类型擦除模型,所以我们首先尝试使用存在类型:

scala> val intsToStrings = pairs collect { case pair: (_, _) => pair }
intsToString: scala.collection.immutable.Map[Any,Any] = Map(1 …
Run Code Online (Sandbox Code Playgroud)

compiler-construction jvm scala type-erasure scala-collections

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

使用-deprecation运行SBT

我似乎在我的project/build.scala文件中有警告(不在我的SCALA PROJECT中).如何配置SBT以使用该-deprecation标志运行.

// Does not help so do not suggest it!
scalacOptions ++= Seq("-unchecked", "-deprecation")
Run Code Online (Sandbox Code Playgroud)

我知道SBT有sbt.boot.properties文件,但无法弄清楚该标志是否应该进入.如果这是一个例子会很好.Thx提前.

BTW

我使用SBT发射器为0.12.2并且SBT 0.12.2和0.11.3都有问题.如果重要的话,我会在Ubuntu上.

scala sbt

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

Scala中的特征与包

看完马丁关于反思和编纂的主题演讲后,我似乎无法从头脑中得到这个疯狂的问题.马丁谈到了"(婚礼)蛋糕模式",其中特质扮演着核心角色.我想知道,为什么在世界上我们需要包装时我们已经有了特征?有什么package可以做的,什么trait(至少在理论上)不能?

我不是在谈论当前的实现,我只是想象一下,如果我们用特征替换包,那会是什么样的编程.在我脑海里,它会是这样的:

  • 一个关键字少(package不需要)
  • 不需要package objects

总结我的所有问题:

  1. 理论上是否可以从语言中删除包并使用特征.
  2. 我们从这一变化中获得了哪些其他好处?(我在想初级包和第一类导入,但mixin组合是一个编译时间的事情,虽然超级调用是动态绑定的)
  3. Java/JVM兼容性是唯一的,它会阻碍吗?

更新

Daniel Spiewak在这个关于依赖注入的主题演讲中谈到了使用Cake Pattern可以做的所有事情的冰山一角.

scala namespaces traits package

8
推荐指数
2
解决办法
1882
查看次数

什么是AnyVal.types有用吗?

我不小心写了这行代码:

scala> val f = Int
f: Int.type = object scala.Int
Run Code Online (Sandbox Code Playgroud)

似乎适用于AnyValAnyVal自身之外的每个子类型.

有什么我可以使用的f,或者它只是Scala漏出的实现细节?

types scala

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

WebSocket的错误网址方案

我在play 2.1中有一个websockets程序,它运行得很好,模板看起来像这样:

// Contents of the view.scala.html file
@(userName: String)(implicit request: RequestHeader)

@main("text") {
  <script type="text/javascript" charset="utf-8">
  $(function() {
    var WS = window['MozWebSocket'] ? MozWebSocket : WebSocket;
    alert("before")
    var socket = new WS("@routes.Application.view(userName).webSocketURL()");
    alert("after")
    socket.onmessage = function(event) {
      alert(event.data);
    };
  });
  </script>
}
Run Code Online (Sandbox Code Playgroud)

问题是,只要我将javascript移动到assets.javascripts文件夹中并将view.scala.html文件更改为以下内容,它就会停止工作.

// Contents of the view.scala.html file
@(userName: String)(implicit request: RequestHeader)

@main("text") {
  <script type="text/javascript" charset="utf-8"
          src="@routes.Assets.at("javascripts/viewer.min.js")"></script>
}
Run Code Online (Sandbox Code Playgroud)

Play找到文件,执行javascript,我可以看到由alert("before")代码行触发的弹出窗口,但之后......没有.

这是我在控制台中收到的Google Chrome错误:

Wrong url scheme for WebSocket
http://localhost:9000/@routes.Application.view(userName).webSocketURL()
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

javascript playframework-2.0

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

儿童演员是否知道他正在恢复?

想象一下直截了当的监督层级.孩子死了.父亲决定要Restart孩子.当Restart编辑时,postRestart和朋友们一起打电话,但如果父亲决定重新开始孩子怎么办?儿童演员是否知道他正在恢复?顺便说一下.父亲是否可以访问导致孩子出现异常的信息?

fault-tolerance actor akka akka-supervision

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

Scala中辅助构造函数的问题

我偶然发现了这个问题:在Scala中,我如何以无状态,功能性的方式建立银行账户?.建议的解决方案看似合理:

// Here is the important part of the answer
class Account(balance: Int) {
    def deposit(amount: Int): Account // the implementation was left out...
}
Run Code Online (Sandbox Code Playgroud)

我对此解决方案的问题是主构造函数是公共的.因此,如果用户程序员创建了一个新帐户,他可以向其传递任意值.如果我总是希望它为零怎么办?无论如何,这是一个新账户,为什么它的数量应该是零呢?

据我所知,使用私有主构造函数创建公共类是不可能的.另一方面,辅助构造函数可能是私有的,这正是我试图做的.

class Account {
  val balance = 0

  private def this(amount: Int) = {
    this()
    balance = amount // won't compile since balance is a val
  }

  def deposit(amount: Int): Account = new Account(balance + amount)
}
Run Code Online (Sandbox Code Playgroud)

我确切地知道问题是什么,但我不知道如何解决它,这有点令人尴尬......

constructor scala

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