【问题标题】:Scala 2.10 Pass field as argumentScala 2.10 将字段作为参数传递
【发布时间】:2013-08-20 11:45:51
【问题描述】:

想想这样的案例类:

case class User(firstname: String, lastname: String)

现在考虑用名字调用方法check

check(User.firstname)

问题是,check 方法也必须有字段的名称。它必须有 fieldname 和 fieldvalue -> "firstname" 和 "John"

问题是,是否可以通过 check(User.firstname) 样式中的类的字段而不是其值?

我认为检查可能看起来像这样(preudocode):

def check(fieldName: String, fieldValue: Any) = {
    println(fieldName + ": " + fieldValue)
}

或者这个

def check(field: Field) = {
    println(field.getName)
}

我可以手动将字段名作为字符串传递,但问题是,如果我重构字段名并且它必须匹配,则字符串不会改变。

也许宏可以提供帮助?有没有其他解决办法?

【问题讨论】:

    标签: reflection implicit-conversion implicit scala-2.10 scala-macros


    【解决方案1】:

    enter link description herefirst 我假设检查方法总是返回相同的类型(Unit\String),否则你需要使用泛型。 其次,可以使用 Enums 进行映射

    myEnum match {
      case MyEnum.firstname => myObj.firstname
      case MyEnum.lastname =>myObj.lastname 
      case _ => ....
    
    }
    

    如果您不想使用 Enums,则必须使用 scala 反射。 Scala 2.10 reflection, how do I extract the field values from a case class

    【讨论】:

    • 问题是当我重构类的字段名时枚举名称不会自动更改,但它们必须匹配。我可以借助反射和手动获取字段(实际上我正在这样做),但这会导致 API 非常不舒适。
    • 我想不出其他解决方案。您可以使用动态特征以获得更好的 api scala-lang.org/api/current/index.html#scala.Dynamic
    【解决方案2】:

    如果字段名在编译时已知,您可以使用宏。否则,您可以使用运行时反射。因此,运行时反射为您提供了更大的灵活性,而宏为您提供了更好的性能和编译时安全性。

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多