我正在尝试使用一个类作为单个接口聚合一堆API函数的代理.其中一些是nullary函数,但我不希望将它们包含在类构造函数中以触发API调用.我现在的解决方案是将调用包装在一个文字的nullary函数中new myClass(() => apiCall),然后显式调用成员函数.这并不是那么糟糕,但我想知道是否有技术原因我不能只使用call-by-name参数来传递对方法的延迟引用?
例:
scala> class MyClass(val apiCall: => String)
<console>:1: error: `val' parameters may not be call-by-name
class MyClass(val apiCall: => String)
Run Code Online (Sandbox Code Playgroud)
编辑我应该指定我的问题是为什么类不能有val参数.添加了一个示例.
我被一个生产错误所困,我把一个不纯的0元函数传递给了一个错误地期望一个裸结果类型的类.
def impureFunc(): Future[Any] = ???
case class MyService(impureDependency: Future[Any] /* should have been () => Future[Any] */)
Run Code Online (Sandbox Code Playgroud)
实际上,这会MyService立即调用impureFunc并缓存程序生命周期的第一个结果,从而导致一个非常微妙的错误.
通常,类型系统会阻止这类错误,但由于能够在没有参数列表的情况下调用0-ary函数,编译器会接受此程序.
显然,这是Scala的"功能",旨在使代码看起来更干净,但这是一个糟糕的问题.有没有办法使这成为编译器警告或linting错误?换句话说,不赞成"空应用程序"类型的隐式方法转换?
我正在尝试使用JSON和Play Framework 2.1.0和Scala 2.10序列化/反序列化.我正在使用Anorm,我有一个非常简单的对象,我想存储在数据库中.订单很简单:
case class Order(id: Pk[Long] = NotAssigned, mfg: String, tp: String)
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我正在尝试构建一个REST接口,以便能够接受并发送一个Order实例(上面)作为JSON.在那里,我有以下代码:
implicit object PkFormat extends Format[Pk[Long]] {
def reads(json: JsValue):Pk[Long] = Id(json.as[Long])
def writes(id: Pk[Long]):JsNumber = JsNumber(id.get)
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用以下命令运行"play test"时,这无法编译:
重写方法读取特征读取类型(json:play.api.libs.json.JsValue)play.api.libs.json.JsResult [anorm.Pk [Long]]; [error]方法读取有不兼容的类型[错误] def读取(json:JsValue):Pk [Long] = Id(json.as [Long])
有谁知道为什么会这样?
我在JAXB方面有很多经验,但我对Play和Scala都是新手,到目前为止我还没有找到任何答案.这看起来像一个非常简单的用例,实际上我希望有一个更简单的解决方案(如Annotations),但我找不到(至少还没有)
任何帮助是极大的赞赏!
谢谢
json scala playframework playframework-2.0 playframework-json
我有一个具有固定导航栏的网站,我想使用 Zurb Joyride 将提示附加到导航栏中的元素。问题是,当页面滚动时,导航栏保持不变,但工具提示却没有。
我尝试将工具提示附加到导航栏中的元素(而不是body),但我遇到了奇怪的渲染问题。设置position: fixed包含div提示似乎可行,但我想知道是否有一种简单的方法可以以编程方式检测元素是否不滚动,因为它包含在固定位置容器中,以便我可以检测何时设置 Joyride 提示也已修复。有什么建议么?
我正在使用Sass作为我的CSS preprocesser,我正试图让它通过资产管道运行.我已经尝试将这个sassTask实现为源文件任务和Web资产任务,但我遇到了两个方面的问题.
如果我将Sass作为源任务运行(见下文),它会在activator run请求页面时触发,并在页面重新加载时找到更新的文件.我遇到的问题是生成的CSS文件都被直接转储target/web/public/main/lib到子目录中,而不是反映在它们内置到resources-managed目录下的子目录中.我无法弄清楚如何实现这一目标.
相反,我尝试将Sass编译实现为Web资产任务(见下文).据我所知,以这种方式工作resources-managed并没有发挥作用,所以我将我的文件直接编译成target/web/public/main/lib.我确定我没有足够动态地做这件事,但我不知道怎么做得更好.但这里最大的问题是管道在完成工作时显然不会运行activator run.我可以让它运行使用activator stage,但我真的需要它在常规开发工作流程中工作,以便我可以在开发服务器运行时更改样式文件,与Scala文件相同.
我试过梳理这些论坛,通过sbt-web文档,以及一些现有的插件,但我发现这个过程非常令人沮丧,因为SBT的复杂性和实际发生的事情的不透明性.构建过程.
Sass编译作为源文件任务:
lazy val sassTask = TaskKey[Seq[java.io.File]]("sassTask", "Compiles Sass files")
sassTask := {
import sys.process._
val x = (WebKeys.nodeModules in Assets).value
val sourceDir = (sourceDirectory in Assets).value
val targetDir = (resourceManaged in Assets).value
Seq("sass", "-I", "target/web/web-modules/main/webjars/lib/susy/sass", "--update", s"$sourceDir:$targetDir").!
val sources = sourceDir ** "*.scss"
val mappings = sources pair relativeTo(sourceDir)
val renamed = mappings map { case (file, path) …Run Code Online (Sandbox Code Playgroud) 我正在研究Scala并遇到了以下难题.
我可以定义以下案例类:
abstract class Expr
case class Number(n: Int) extends Expr
Run Code Online (Sandbox Code Playgroud)
当我从类中创建两个实例Number并进行比较时
val x1 = Number(1)
val x2 = Number(1)
x1 == x2
Run Code Online (Sandbox Code Playgroud)
我有以下结果:
x1:数字=数字(1)
x2:数字=数字(1)
res0:Boolean = true
所以,x1和x2是相同的.
但是,如果我case在Number类定义中删除修饰符,即
abstract class Expr
class Number(n: Int) extends Expr
Run Code Online (Sandbox Code Playgroud)
然后Number以相同的方式比较该类中的两个实例
val x1 = new Number(1)
val x2 = new Number(1)
x1 == x2
Run Code Online (Sandbox Code Playgroud)
我有以下输出:
x1:Number = Number @ 1175e2db
x2:Number = Number @ 61064425
res0:Boolean = false
它说这次 …
我正在开发一个基于Akka Persistent FSM的项目.特别是:
我想知道构建独立测试用例的最佳方法是什么?由于状态更改是持久的(这在文档中没有很好地解释,但可以在这里看到),确保我的持久性actor始终处于干净状态可能很棘手.是否有必要手动将重置为我的actor FSM协议?如果是这样,这似乎并不理想,因为它的新行为需要自己进行测试.
在测试中管理期刊本身的最佳方法是什么?有没有一种简单的方法可以配置使用不同的日志进行测试,而不必在演员设计本身中明确选择这个选项?文档的插件TCK部分提到手动删除整个日志文件.这对于测试插件本身似乎是合理的,但对于应用程序代码来说似乎是一种不必要的低级解决方案.也许我需要明确调用期刊的asyncDeleteMessagesTo进行测试拆除?这看起来仍然很低级,但也许它只是尚未构建到库中的基础架构.
使用默认配置,Next 指示 Babel 在客户端为我的异步函数使用生成器。这使得调试更具挑战性,这看起来应该如此。如何禁用此行为?
我正在使用一个 Electron 应用程序,所以我真的想要最少的转换来匹配 Chromium 运行时。
这是我当前的"babel"关键内容package.json:
"babel": {
"presets": [
[
"next/babel",
{
"preset-env": {
"targets": {
"chromium": 73,
"node": 11
}
},
"transform-runtime": {
"regenerator": false
}
}
]
]
}
Run Code Online (Sandbox Code Playgroud)
这里的结果是不包含 regenerator,但它在 Webpack 生成的代码中崩溃。如果我取消禁用regenerator,我可以看到资产仍在将async函数转换为生成器,无论如何。
根据Wolfram Alpha的说法,这是真的x > 2.
6.0/(x+16) > 2.0/(x+4)
Run Code Online (Sandbox Code Playgroud)
为了尽可能小x,我正在使用numpy.nextafter().
>>> from numpy import nextafter
>>> x = nextafter(2,2+1)
>>> x
2.0000000000000004
Run Code Online (Sandbox Code Playgroud)
然而.
>>> 6.0/(x+16) > 2.0/(x+4)
False
Run Code Online (Sandbox Code Playgroud)
奇怪的.
>>> x+1
3.0000000000000004
>>> x+4
6.0
Run Code Online (Sandbox Code Playgroud)
那么如何x > 2在这种情况下获得实际可能的最小值呢?
我尝试使用Scala到Json在play 2.0应用程序中序列化我的模型.这是我的代码的样子:
package models
import play.api.libs.json._
case class Task(id: Long, label: String, date: String)
object Task {
...
implicit object TaskFormat extends Format[Task] {
def reads(json: JsValue): Task = Task(
(json \ "id").as[Long],
(json \ "label").as[String],
(json \ "date").as[String])
def writes(t: Task): JsValue = JsObject(Seq(
"id" -> JsNumber(t.id),
"label" -> JsString(t.label),
"date" -> JsString(t.date)))
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,运行应用程序时出现以下错误:
verriding method reads in trait Reads of type (json: play.api.libs.json.JsValue)play.api.libs.json.JsResult[models.Task]; method reads has incompatible type
Run Code Online (Sandbox Code Playgroud)
我还没有找到解决方案.api的文档(http://www.playframework.org/documentation/api/2.0/scala/play/api/libs/json/package.html)似乎也暗示了我采取的方法.
有人发现我的错误吗?
非常感谢,
乔尔
scala ×6
json ×2
akka ×1
async-await ×1
babeljs ×1
case-class ×1
electron ×1
ieee-754 ×1
jackson ×1
javascript ×1
next.js ×1
numpy ×1
python ×1
python-2.7 ×1
sbt ×1
sbt-web ×1
zurb-joyride ×1