我脑子里有以下课程:
abstract class MyClass (data: MyData) {
def update(): MyClass = {
new MyClass(process())
}
def process(): MyData = {
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,无法实例化抽象类,因此该行new MyClass(process())是错误的.我的问题是 - 有没有办法告诉编译器,在MyClass的每个子类的情况下,我想创建一个完全该子类的对象?在所有子类中编写此方法awhole似乎有点过分.使用类或方法的类型参数我无法实现自己.
我想在Scala中开发一个相当简单的Web应用程序,使用Lift或Play框架,使用Eclipse作为环境和一些简单的Web服务器,如Jetty.然而,令我无法形容的惊讶的是,我无法将整个事情设置为一起工作.我也找不到任何明智而简单明了的如何做到这一点的指南.经过半天的搜索,我发现周围的每个人似乎都使用混合的sbt/maven,感觉可以从一个移植到另一个并手动编写项目配置文件,只是为了得到一个简单的空白项目.
创建一个空项目没有简单的简单方法.使用Java我记得只需点击几下 - 将Web服务器集成到Eclipse中,创建一个简单的Web应用程序项目并从那里运行它.在这种情况下,Scala的强大功能和简洁性在哪里?只有当我想试试Lift时才会这样.如果我想尝试播放怎么办?如果我再次走同样的道路怎么办?
有没有一个简单而完整的指南,描述如何设置环境,以便可以立即开始开发应用程序?
更新:由于Peter Gwiazda的建议,我已经与Eclipse进行了成功的Play项目集成,具有Play开箱即用的所有功能.我正在使用此设置进行开发.但是,我感兴趣的问题仍然是:与其他框架(如Lift,Scalatra等)实现类似功能的其他方法是什么?
在我的Play 2.0.4程序中,我有这段代码:
val channel = Enumerator.imperative[JsValue](onStart = self ! NotifyJoin(username))
Run Code Online (Sandbox Code Playgroud)
现在它说imperative已经弃用了,API说我应该使用unicast或broadcast代替.我倾向于使用,unicast因为在我的代码中channel是单播.所以我喜欢
val channel = Concurrent.unicast[JsValue](onStart = self ! NotifyJoin(username))
Run Code Online (Sandbox Code Playgroud)
但它不起作用..看起来像是unicast想要别的东西.我无法弄清楚 - API中没有更多信息......有谁知道该怎么做?
更新:
在Play Framework用户组中开始讨论.事实证明,对于那些了解范式的开发人员来说,这是一个非常普遍的问题.希望文档能够得到改进.
在Scala编程中,第239页,第一段说:
组合和继承是根据另一个现有类定义新类的两种方法.如果你所追求的主要是代码重用,你通常应该更喜欢组合继承.只有继承会受到脆弱的基类问题的困扰,在这个问题中,你可以通过更改超类来无意中破坏子类.
对我来说还不清楚.任何人都可以展示这种情况的一个例子,最好有一些代码吗?
这是我在Scala中遇到的一些不会导致Java出现任何问题的东西.现在我只是不知道在Scala中这样做的正确方法是什么.
问题描述:我有一个Scala对象,它表示一个'抽象'对象.它打算有一个单一的配置文件,但它并不打算用于实际用途,它只是它的儿童单身人士常见的一堆定义.所以相反,我想用它的孩子.所以有一个问题:因为我不能继承对象,是否应该将常见的单例功能实现为类?作为一个抽象类?特质不适合我,因为它不能有构造函数.如果抽象父类会这样做,那么如果我需要它们,我应该如何访问它的单例(或静态)方法呢?我意识到我的设计可能存在缺陷,但由于我有这个问题并且无法想出任何明确的答案,所以听到你说的话(包括设计备选方案)很有意思.
我正在尝试使用该Option.getOrElse()方法,但它返回etiher Any或者ScalaObject而不是正确Option参数化的类的实例.我找不到任何关于这个问题的提及,它似乎不应该存在.我究竟做错了什么?
class MyClass {
def isOk = true
}
val myVal = Some(new MyClass) // :Option[MyClass]
val check = myVal.getOrElse(false).isOk
Run Code Online (Sandbox Code Playgroud)
无法调用该isOk方法,因为它尝试调用它Any.
我有一个表单,其中包含我创建的多个下拉列表select以及options模板中的帮助程序.应填充列表的实体从数据库中获取.但是,从数据库中检索是异步的,因此我应该Async在操作中使用,如本示例所示.但是,就我而言,我没有一个find操作可以等待,而是一个未知大小Seq的Future对象.那么我怎样才能Future在渲染页面之前等待多个-s准备列表?或者也许有更好的方法来做到这一点?
scala mongodb playframework playframework-2.0 playframework-2.1
我正在使用Scala构建DSL,我有这样一个对象:
object block {
def apply(content: String): String = "{\n" + content + "}\n"
def apply(): String = block("empty block")
}
Run Code Online (Sandbox Code Playgroud)
所以以后在我的DSL中我可以说:
block {
"good stuff goes here"
}
Run Code Online (Sandbox Code Playgroud)
没关系,但apply()我想用第二种方法让用户写空块,以便以后填写.但是编译器不允许apply()用花括号调用无参数方法...除了使用括号之外还有什么办法吗?如果不是,那为什么不允许这样做?
更新:供参考:两个答案应合并为全图.
我在 Clojure 中创建了一个简单的协议和一个类型:
(defprotocol Saving
(save [this] "saves to mongodb"))
;default implementation
(extend-type Object
Saving
(save [this] (encode this)))
(deftype NewsItem
[text date]
Saving)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试时:
=> (def news-item (->NewsItem "Super News!!!" "today"))
Run Code Online (Sandbox Code Playgroud)
进而:
=> (save news-item)
Run Code Online (Sandbox Code Playgroud)
我得到:
AbstractMethodError luminous_test.models.model.NewsItem.save()Ljava/lang/Object; luminous-test.models.model/eval2450 (NO_SOURCE_FILE:1)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我想遵循创建默认协议实现的思路,但这就是我得到的......
我创建了一个宏,它创建一个dispatcher带有3个关联函数的命名get-dispatcher,set-dispatcher并call-dispatcher与调度程序一起工作(它们获得一个调度函数,添加一个或调用一个).一切正常!但是,现在我想自动创建相关的函数名称,因此我将宏的所有这些内部放入let定义该简单构造函数的内容中.请注意,在下面的代码中,只有get-函数的名称是使用该自动化构造的.在set-和call-那些名创建仍然有人工气味.
(defmacro create-dispatcher [name]
;creates a set of dispatching functions tagged
`(do
;define dispatcher
(def ~(symbol name) ~(atom {}))
(let
[name-w-prefix (fn [x] (~(symbol (str x "-" name))))]
; -- define getter
(defn (name-w-prefix "get")
"get-dispatcher [tag]: get a dispatcher fn by tag"
(~'[] (println "no tag is provided for '" ~(str name) "' dispatcher"))
(~'[tag]
(do
(println "dispatcher '" ~(str name) "' called …Run Code Online (Sandbox Code Playgroud) scala ×7
clojure ×2
inheritance ×2
architecture ×1
composition ×1
dsl ×1
let ×1
macros ×1
mongodb ×1
object ×1
oop ×1
option ×1
protocols ×1
scala-ide ×1
singleton ×1
type-erasure ×1