gpt4 book ai didi

spray - 指令如何在 Spray 中工作?

转载 作者:行者123 更新时间:2023-12-01 23:04:43 28 4
gpt4 key购买 nike

我想了解 Spray 中的指令是如何工作的。 As per the documentation :

The general anatomy of a directive is as follows:

name(arguments) { extractions =>
... // inner Route
}

我的基本理解是,在下面的代码片段中,32 作为参数传递给方法 test

test {
32
}

但是,在上面的指令name例子中,说的是arguments被传递到inner route,这是一个匿名函数。

有人可以帮助我理解语法和流程,从如何提取参数并将其传递到内部路由开始吗?

最佳答案

你是对的,该语法将 32 传递给函数 test。您缺少的是 Directive 接受一个函数作为参数(记住,我们现在正在做函数式编程所以函数就是值 ).如果你想这样写:

path(IntNumber) {
userId =>
complete(s"Hello user $userId")
}

以一种不那么 DSL-ey 的方式,你可以这样做:

val innerFunction: Int => Route = {userId => complete(s"Hello user $userId")}
(path(IntNumber))(innerFunction)

甚至这样:

def innerMethod(userId: Int): Route = complete(s"Hello user $userId")
(path(IntNumber))(innerMethod)

这实际上是如何实现的机制是……复杂的;此方法使 Directive 可隐式转换为函数:

implicit def pimpApply[L <: HList](directive: Directive[L])(implicit hac: ApplyConverter[L]): hac.In ⇒ Route = f ⇒ directive.happly(hac(f))

这是使用“磁铁模式”来选择合适的hac,这样如果指令提取参数,它就可以在内部路径中获取一个函数(具有适当数量的参数),或者如果指令不提取参数,则为内部路径(普通路由)中的值。代码看起来比实际更复杂,因为 scala 不直接支持完全依赖类型,所以我们必须通过隐式来模拟它。请参阅 ApplyConverterInstances 了解这需要的可怕代码:/。

当我们在特定指令的 happly 方法中获得实际路线时,实际提取全部发生。 (如果一切都使用 HList ,我们基本上可以避免/忽略前面的恐怖)。大多数 extract-ey 指令(例如 path)最终调用 hextract:

def hextract[L <: HList](f: RequestContext ⇒ L): Directive[L] = new Directive[L] {
def happly(inner: L ⇒ Route) = ctx ⇒ inner(f(ctx))(ctx)
}

记住 Route 实际上只是一个 RequestContext => Unit,所以这会返回一个 Route,当传递一个 RequestContext :

  1. 在其上运行 f,以提取需要提取的内容(例如 URL 路径组件)
  2. that 上运行 innerinner 是一个函数,例如内部路由的路径组件。
  3. 在上下文中运行该内部路由。

(以下内容由评论对话中的 mod 编辑):

从根本上讲还是挺优雅的,能看到所有的spray代码而且都是普通的scala代码真是太棒了(真心推荐大家在迷茫的时候阅读源码)。但是与 ApplyConverter 的“桥接”部分很复杂,而且真的没有办法解决这个问题;它来自于尝试使用一种并非真正为它们设计的语言来实现完全依赖的类型。

您必须记住,喷雾路由 DSL 是 DSL;这是几乎任何其他语言都必须作为外部配置文件的东西。我想不出有哪个 Web 框架能够提供与 spray 具有完全编译时类型安全性的路由定义相同的灵 active 。所以,是的,spray 做的一些事情很复杂——但正如引述所说,简单的事情应该很容易,而困难的事情应该是可能的。所有 scala 级别的东西都很简单; spray 很复杂,但在另一种语言中会更复杂(不可用)。

关于spray - 指令如何在 Spray 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27777668/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com