假设我有一些traits,每个都为扩展的类添加一些行为Actor.
它们每个都需要一小部分方法Actor.他们都可以Actor像这样延伸吗?
trait A extends Actor {
def doAThing = { ... }
}
trait B extends Actor {
def doBThing = { ... }
}
trait C extends Actor {
def doCThing = { ... }
}
class D extends Actor with A with B with C
Run Code Online (Sandbox Code Playgroud)
或者每个特征是否应该从Actor抽象方法中定义它所需的方法,以便它们由最终的具体类提供,这是唯一一个将扩展的类Actor?
我正在尝试包装spray-json解析器,使其返回Option而不是抛出异常.
作为第一步,我只是尝试用自己的方法包装方法,但是我在使它成为通用方法时遇到了问题.
解析器使用隐式格式对象(为我正在使用的具体类型定义)但是当该方法是通用的时,编译器会抱怨:
[error] Cannot find JsonReader or JsonFormat type class for T
[error] def parse[T](s: String): T = JsonParser(s).convertTo[T]
Run Code Online (Sandbox Code Playgroud)
这是相关的代码:
case class Person(name: String)
object Protocols {
implicit val personFormat = jsonFormat1(Person)
}
import spray.json._
object Parser {
import com.rsslldnphy.json.Protocols._
// JsonParser(s).convertTo[Person] works fine, but..
def parse[T](s: String): T = JsonParser(s).convertTo[T] // .. doesn't
}
Run Code Online (Sandbox Code Playgroud)
我需要做些什么才能让它发挥作用?
我有一个课程,我正在努力扩展DelayedInit:
class Foo extends DelayedInit {
// expensive initialisation code
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行时,sbt compile我收到错误:
Foo needs to be abstract, since method delayedInit in trait DelayedInit of type (x: => Unit)Unit is not defined
Run Code Online (Sandbox Code Playgroud)
我的理解是,通过扩展DelayedInit特征,任何初始化代码都应自动包装在一个闭包中,并delayedInit在初始化完成后在方法中运行.但是我用谷歌搜索了,似乎无法找到一个使用示例.我错过了什么?
刚刚开始使用Play框架和一个轻微的刺激因素,当我进行更改然后刷新它需要很长时间(几秒钟)才能重新编译,所以我可以在浏览器中看到它.例如,在对视图进行许多微小调整时,这会有点恼人.
是否有一种神奇的方法可以让Play尝试在源文件发生更改时重新编译,而不是等到刷新浏览器?
我不喜欢将隐式参数引入我的代码中,所以在我使用它们时我想封装它们的用法.所以我试图定义一个对象,它既包含对异常处理的spray-json的调用,又包含每个模型类的默认隐式JsonFormats.但是,隐式参数不会被解析,除非它们被导入到客户端,调用代码,这正是我不想要它们的地方.这是我到目前为止(它没有解决隐式格式化程序),有没有办法让我得到我想要的工作?
package com.rsslldnphy.json
import com.rsslldnphy.models._
import spray.json._
object Json extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)
def parse[T](s:String)(implicit reader: JsonReader[T]): Option[T] = {
try { Some(JsonParser(s).convertTo[T]) }
catch { case e: DeserializationException => None }
}
}
Run Code Online (Sandbox Code Playgroud)
NB.JsonFormat是一种JsonReader
编辑:这是我根据@ paradigmatic的第二个建议(我无法工作,我仍然得到Cannot find JsonReader or JsonFormat type class for T)写的.我错过了什么吗?
object Protocols extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)
}
object Json {
def parse[T](s:String): Option[T] = { …Run Code Online (Sandbox Code Playgroud) 如果我正在针对(相对)复杂的案例类进行大量模式匹配,但大多数时候我只对其中的一个或两个字段感兴趣.有没有办法抽象掉其他字段(也许是通过包装类?)?这是我正在尝试简化的事物类型的示例:
def receive = {
case HttpRequest(POST, "foo", _, HttpBody(_, body), _) => // action
case HttpRequest(GET, "bar", _, _, _) => // action
}
Run Code Online (Sandbox Code Playgroud)
我只是对请求类型,url和有时身体感兴趣,所以我最好将模式匹配定义为case Request(POST, "foo", body)或类似.
我写了一个小的Ruby命令行应用程序,用于在我的Mac硬盘上保持电视节目的组织.鉴于电视剧集的性质,有一些剧集包括/角色.
在Mac上,文件系统实际上允许我编写这个文件,如果我手动重命名文件,/一切都很好.
Ruby File.rename在我的脚本中运行的那一刻然而我只是得到一个No such file or directory错误,因为Ruby试图/将文件名作为应该存在的文件夹读取.
这是一个例子:
输出路径是 /TV/Showname/Season 1/Showname - 1x07 - 5/1.mp4
现在不是寻找文件夹/Showname - 1x07 - 5/并写入其中的1.mp4文件,我怎么能告诉ruby简单地取文件名(Showname - 1x07 - 5/1.mp4)并将其写入Season 1文件夹中?
谢谢阅读.