小编non*_*com的帖子

Scala抽象类方法,返回一个新的相应类子对象

我脑子里有以下课程:

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似乎有点过分.使用类或方法的类型参数我无法实现自己.

abstract-class scala

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

Scala + Eclipse + WebServer =一个Web应用程序

我想在Scala中开发一个相当简单的Web应用程序,使用Lift或Play框架,使用Eclipse作为环境和一些简单的Web服务器,如Jetty.然而,令我无法形容的惊讶的是,我无法将整个事情设置为一起工作.我也找不到任何明智而简单明了的如何做到这一点的指南.经过半天的搜索,我发现周围的每个人似乎都使用混合的sbt/maven,感觉可以从一个移植到另一个并手动编写项目配置文件,只是为了得到一个简单的空白项目.

创建一个空项目没有简单的简单方法.使用Java我记得只需点击几下 - 将Web服务器集成到Eclipse中,创建一个简单的Web应用程序项目并从那里运行它.在这种情况下,Scala的强大功能和简洁性在哪里?只有当我想试试Lift时才会这样.如果我想尝试播放怎么办?如果我再次走同样的道路怎么办?

有没有一个简单而完整的指南,描述如何设置环境,以便可以立即开始开发应用程序?

更新:由于Peter Gwiazda的建议,我已经与Eclipse进行了成功的Play项目集成,具有Play开箱即用的所有功能.我正在使用此设置进行开发.但是,我感兴趣的问题仍然是:与其他框架(如Lift,Scalatra等)实现类似功能的其他方法是什么?

scala web-applications scala-ide

5
推荐指数
2
解决办法
2089
查看次数

PlayFramework 2.0.x - > 2.1-RC迁移

在我的Play 2.0.4程序中,我有这段代码:

val channel = Enumerator.imperative[JsValue](onStart = self ! NotifyJoin(username))
Run Code Online (Sandbox Code Playgroud)

现在它说imperative已经弃用了,API说我应该使用unicastbroadcast代替.我倾向于使用,unicast因为在我的代码中channel是单播.所以我喜欢

val channel = Concurrent.unicast[JsValue](onStart = self ! NotifyJoin(username))
Run Code Online (Sandbox Code Playgroud)

但它不起作用..看起来像是unicast想要别的东西.我无法弄清楚 - API中没有更多信息......有谁知道该怎么做?

更新:

在Play Framework用户组中开始讨论.事实证明,对于那些了解范式的开发人员来说,这是一个非常普遍的问题.希望文档能够得到改进.

playframework playframework-2.0 playframework-2.1

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

OOP哲学(Scala编程中的组合和继承的摘录)

在Scala编程中,第239页,第一段说:

组合和继承是根据另一个现有类定义新类的两种方法.如果你所追求的主要是代码重用,你通常应该更喜欢组合继承.只有继承会受到脆弱的基类问题的困扰,在这个问题中,你可以通过更改超类来无意中破坏子类.

对我来说还不清楚.任何人都可以展示这种情况的一个例子,最好有一些代码吗?

architecture oop inheritance scala composition

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

Scala - 组织单例对象层次结构的正确方法是什么?

这是我在Scala中遇到的一些不会导致Java出现任何问题的东西.现在我只是不知道在Scala中这样做的正确方法是什么.

问题描述:我有一个Scala对象,它表示一个'抽象'对象.它打算有一个单一的配置文件,但它并不打算用于实际用途,它只是它的儿童单身人士常见的一堆定义.所以相反,我想用它的孩子.所以有一个问题:因为我不能继承对象,是否应该将常见的单例功能实现为类?作为一个抽象类?特质不适合我,因为它不能有构造函数.如果抽象父类会这样做,那么如果我需要它们,我应该如何访问它的单例(或静态)方法呢?我意识到我的设计可能存在缺陷,但由于我有这个问题并且无法想出任何明确的答案,所以听到你说的话(包括设计备选方案)很有意思.

inheritance singleton scala object

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

Scala - Option.getOrElse()"类型擦除"?

我正在尝试使用该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.

scala type-erasure option

4
推荐指数
3
解决办法
7889
查看次数

Play Framework 2.1 + ReactiveMongo - 填充多个下拉列表

我有一个表单,其中包含我创建的多个下拉列表select以及options模板中的帮助程序.应填充列表的实体从数据库中获取.但是,从数据库中检索是异步的,因此我应该Async在操作中使用,如本示例所示.但是,就我而言,我没有一个find操作可以等待,而是一个未知大小SeqFuture对象.那么我怎样才能Future在渲染页面之前等待多个-s准备列表?或者也许有更好的方法来做到这一点?

scala mongodb playframework playframework-2.0 playframework-2.1

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

Scala - `apply()`不带参数方法和调用时的曲线括号

我正在使用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()用花括号调用无参数方法...除了使用括号之外还有什么办法吗?如果不是,那为什么不允许这样做?

更新:供参考:两个答案应合并为全图.

dsl scala

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

Clojure - 对象上的默认协议实现失败?

我在 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)

我究竟做错了什么?我想遵循创建默认协议实现的思路,但这就是我得到的......

protocols clojure

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

Clojure - 宏中的一个让步不起作用

我创建了一个宏,它创建一个dispatcher带有3个关联函数的命名get-dispatcher,set-dispatchercall-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)

macros clojure let

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