dsl用于捕获字段名称

时间:2014-11-22 23:24:21

标签: scala reflection

我正在开发一个mapper,想要一种类型安全的方法来捕获用于映射的类字段名,并使用我在C#中使用的语法:

case class Person(name: String, age: Int)

new Mapping[Person]() { 
  field(_.age).name("person_age").colType[java.lang.Integer]
  field(_.name).name("person_name")
}

其中def field(m: T => Unit): FieldMap

这会触发以下警告:

Warning:(97, 13) a pure expression does nothing in statement position; you may be omitting necessary parentheses
field(_.age).name("person_age").colType[java.lang.Integer]
        ^
Warning:(98, 13) a pure expression does nothing in statement position; you may be omitting necessary parentheses
field(_.name).name("person_name")
        ^

很明显,这不是一个理想的语法。我可以通过任何方式调整field的签名以避免警告,还是以类型安全的方式映射字段的更惯用的scala方式?

注意: @ sjrd的回答确实消除了警告,但毕竟scala反射看起来似乎不可行。我的最终目标是Mapper,它允许在编译时检查mannner而不是字符串中指定T成员,因此它不太容易受到错字和重构问题的影响。

1 个答案:

答案 0 :(得分:0)

field方法将T => Unit函数作为参数。因此,lambda _.age(相当于x => x.age)被视为返回Unit。编译器警告您在语句位置(期望类型x.age)中使用纯表达式(Unit),这基本上意味着该表达式无用,并且可能也被删除。

您的问题有一个非常简单的症状解决方案:将m: T => Unit替换为m: T => Any。现在你的表达式x.age不再处于语句位置,编译器很高兴。

但是你的代码表明存在一些错误,因为你显然不会在任何地方使用m的结果。无论如何,为什么m