gpt4 book ai didi

Scala 案例类映射扩展

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

在 groovy 中可以这样做:

class Foo {
Integer a,b
}
Map map = [a:1,b:2]
def foo = new Foo(map) // map expanded, object created

我知道 Scala 在任何意义上都不是 Groovy,但我想知道是否支持在这种情况下进行映射扩展

简单地说,我尝试过但失败了:

case class Foo(a:Int, b:Int)
val map = Map("a"-> 1, "b"-> 2)
Foo(map: _*) // no dice, always applied to first property

一个相关thread显示问题的可能解决方案。

现在,从我能够挖掘的内容来看,至少从 Scala 2.9.1 开始,关于案例类的反射基本上是无操作的。最终结果似乎是人们被迫进行某种形式的手动对象创建,考虑到 Scala 的强大功能,这有点讽刺。

我应该提到用例涉及 servlet 请求参数映射。具体来说,使用 Lift、Play、Spray、Scalatra 等,我想采用经过清理的参数映射(通过路由层过滤)并将其绑定(bind)到目标案例类实例,而无需手动创建对象,也无需指定其类型.这将需要“可靠”的反射和像“str2Date”这样的隐式来处理类型转换错误。

也许在 2.10 中使用新的反射库,实现上述内容将是小菜一碟。使用 Scala 仅 2 个月,所以只是触及表面;我现在看不到任何直接的方法来实现这一目标(对于经验丰富的 Scala 开发人员来说,也许可行)

最佳答案

嗯,好消息是 Scala 的 Product 接口(interface),由所有案例类实现,实际上并没有使这很难做到。我是一个名为 Salat 的 Scala 序列化库的作者,它提供了一些实用程序来使用 pickled Scala 签名来获取类型字段信息

https://github.com/novus/salat - 查看 salat-util 包中的一些实用程序。

实际上,我认为这是 Salat 应该做的事情——真是个好主意。

回复:D.C. Sobral 关于不可能在编译时验证参数的观点 - 已采纳,但实际上这应该在运行时工作,就像反序列化其他任何不保证结构的东西一样,如 JSON 或 Mongo DBObject。此外,Salat 具有实用程序来利用提供的默认参数。

关于Scala 案例类映射扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8747528/

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