这不起作用:
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)
问题:
我在SBT(0.12.2)项目中有自定义任务.让我们给他们打电话a
,b
和c
.因此,当我处于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配置文件中创建一个别名呢?
我最近偶然发现了这篇文章,它"介绍"了collect
Scala集合的方法.用法很简单:
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
我似乎在我的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上.
看完马丁关于反思和编纂的主题演讲后,我似乎无法从头脑中得到这个疯狂的问题.马丁谈到了"(婚礼)蛋糕模式",其中特质扮演着核心角色.我想知道,为什么在世界上我们需要包装时我们已经有了特征?有什么package
可以做的,什么trait
(至少在理论上)不能?
我不是在谈论当前的实现,我只是想象一下,如果我们用特征替换包,那会是什么样的编程.在我脑海里,它会是这样的:
package
不需要)package object
s总结我的所有问题:
更新
Daniel Spiewak在这个关于依赖注入的主题演讲中谈到了使用Cake Pattern可以做的所有事情的冰山一角.
我不小心写了这行代码:
scala> val f = Int
f: Int.type = object scala.Int
Run Code Online (Sandbox Code Playgroud)
似乎适用于AnyVal
除AnyVal
自身之外的每个子类型.
有什么我可以使用的f
,或者它只是Scala漏出的实现细节?
我在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)
我错过了什么?
想象一下直截了当的监督层级.孩子死了.父亲决定要Restart
孩子.当Restart
编辑时,postRestart
和朋友们一起打电话,但如果父亲决定重新开始孩子怎么办?儿童演员是否知道他正在恢复?顺便说一下.父亲是否可以访问导致孩子出现异常的信息?
我偶然发现了这个问题:在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)
我确切地知道问题是什么,但我不知道如何解决它,这有点令人尴尬......
scala ×7
sbt ×2
actor ×1
akka ×1
constructor ×1
inheritance ×1
javascript ×1
jvm ×1
namespaces ×1
package ×1
traits ×1
type-erasure ×1
types ×1