有没有一种简单的方法将案例类转换为元组?
当然,我可以轻松编写样板代码来执行此操作,但我的意思是没有样板.
我真正想要的是一种轻松地按字典顺序编写案例类的方法.我可以通过导入scala.math.Ordering.Implicits._来实现元组的目标,瞧,我的元组有一个为它们定义的Ordering.但scala.math.Ordering中的含义一般不适用于案例类.
Akka HTTP(正式名称为Spray)的一个特性是它能够自动编组和解组从json到案例类等的数据.我已经成功地使这个工作得很好.
目前,我正在尝试创建一个使用查询参数执行GET请求的HTTP客户端.代码目前看起来像这样:
val httpResponse: Future[HttpResponse] =
Http().singleRequest(HttpRequest(
uri = s"""http://${config.getString("http.serverHost")}:${config.getInt("http.port")}/""" +
s"query?seq=${seq}" +
s"&max-mismatches=${maxMismatches}" +
s"&pam-policy=${pamPolicy}"))
Run Code Online (Sandbox Code Playgroud)
嗯,那不是那么漂亮.如果我可以传入一个包含查询参数的case类,并且让Akka HTTP自动生成查询参数,就像它对json一样.(另外,Akka HTTP的服务器端有一种解析GET查询参数的优雅方式,所以人们会认为它也会有一种优雅的方式来生成它们.)
我想做类似以下的事情:
val httpResponse: Future[HttpResponse] =
Http().singleRequest(HttpRequest(
uri = s"""http://${config.getString("http.serverHost")}:${config.getInt("http.port")}/query""",
entity = QueryParams(seq = seq, maxMismatches = maxMismatches, pamPolicy = pamPolicy)))
Run Code Online (Sandbox Code Playgroud)
只是,上述实际上并不起作用.
我想用Akka HTTP以某种方式做什么?或者我只是需要以老式的方式做事?即,显式生成查询参数,就像我在上面的第一个代码块中一样.
(我知道如果我要将其从GET更改为POST,我可能会让它更像我希望它工作,从那时起我可以从案例中自动转换POST请求的内容上课到json,但我真的不想这样做.)
有没有办法干净地杀死 uvicorn?
即,如果它在终端的前台运行,我可以在它上面键入 ^C。这会导致 uvivorn 进程终止,并且所有工作进程都将被清理。(即,他们走开了。)
另一方面,如果 uvicorn 在没有终端的情况下在后台运行,那么我无法想出一种干净地杀死它的方法。它似乎忽略了 SIGTERM、SIGINT 和 SIGHUP。我可以用SIGKILL(即-9)杀死它,但是工作进程仍然存在,我必须跟踪所有工作进程并杀死它们。这并不理想。
我在 Red Hat Enterprise Linux Server 7.3 (Maipo) 上使用带有 CPython 3.7.4、uvivorn 版本 0.11.2 和 FastAPI 0.46.0 的 uvicorn。
有没有办法设置Ammonite脚本中使用的Scala版本?
我刚刚开始使用Ammonite,乍一看它似乎远远超过scalas我迄今为止用过的脚本运行器.有了scalas,但是,我可以很容易地设定在脚本中使用Scala的版本.例如,
#!/usr/bin/env scalas
/***
scalaVersion := "2.11.8"
*/
Run Code Online (Sandbox Code Playgroud)
我在Ammonite文件中找不到任何类似声明的参考.
在这个参数化函数中,为什么我需要演员?我怎么能摆脱它呢?
/** Filters `xs` to have only every nth element.
*/
def everyNth[A <% Iterable[B], B](xs: A, n: Int, offset: Int = 0): A =
(xs.zipWithIndex collect { case (x, i) if (i - offset) % n == 0 => x }).asInstanceOf[A]
Run Code Online (Sandbox Code Playgroud)
如果我最后没有演员,我会收到以下错误消息:
type mismatch; found : Iterable[B] required: A
Run Code Online (Sandbox Code Playgroud)
这个函数(使用强制转换)适用于我尝试过的所有情况,我知道在REPL中输入类似下面的内容,Scala能够在不在参数化函数的上下文中正确推断结果类型:
scala> val a: Stream[Int] = (Stream.from(0).zipWithIndex collect { case (x, i) if (i + 3) % 5 == 0 => x })
a: Stream[Int] = Stream(2, ?)
scala> a …Run Code Online (Sandbox Code Playgroud) 我可以告诉 Git Git 存储库在哪里--git-dir。我可以告诉 Git 工作树在哪里--work-tree。我如何告诉 Git gitignore 文件在哪里?
Q. 为什么我想做这样的事情?
A. 对于一些工作树,我有两个不同的 Git 存储库。一种是在 的标准位置.git。我用于普通版本控制的这个存储库。另一个存储库在.git.sync. 我使用这个存储库在计算机之间进行定期自动同步。即,它是我自己的小 Dropbox 克隆,用 Git 和一个定期运行的小脚本实现。
理想情况下,我可以告诉 Git.gitignore.sync用于.git.sync存储库,而不是让 Git 使用.gitignore它用于正常版本控制的相同内容。
问:我为什么不直接使用 Dropbox?
A. 它不同步符号链接。糟糕的 Dropbox!