【问题标题】:Best way to implement behavior based in type in scala在scala中实现基于类型的行为的最佳方法
【发布时间】:2015-07-11 20:44:00
【问题描述】:

在代码审查期间与朋友进行的友好聊天中,我们注意到代码中有很多:

unknownTypeVal match {
    case asStr: String => //DO SOMETHING FOR STRING
    case asInt: Integer => //DO SOMETHING FOR Integer
    case asMyOwnClass: MyOwnClass => //DO SOMETHING FOR MyOwnClass
}

最初由返回 AnyOption 的方法生成的问题,由于我们使用库作为 XPath 和 JSONPath,它们返回 AnyOption 的实例,因此无法删除它提供的路径。

我不想讨论“preference”,这不是一个意见问题,我想了解最好由 Scala 定义的标准,或任何其他有影响力的组织,为了以更有条理的方式在代码中进行这种“类型检查”,我们认为可以将此功能简化为对包含函数映射并基于“某物”(类的名称)的方法的单个函数调用或我现在不知道的其他东西)确定如何处理此类参数:

process(myAnnonimusVal: Any) = myMapOfFunct(myAnnonimusVal.getClass) //and based on the function that this will return execute such function pasing myAnnonimusVal

Scala 开发人员或 Scala 社区鼓励做什么

【问题讨论】:

  • 为什么您认为这不是一种有效的方法,甚至不是您在帖子中提到的一种有组织的方法?即使在您的 myMapOfFunct 中,您也必须在其中包含您的案例陈述。您唯一要做的就是避免代码重复。
  • 您所希望的权威答案不存在,任何答案都是意见。我自己的观点是:如果你被Any-returning API 卡住了,只要捏住鼻子,把它包裹在 something 中,它会为你提供有意义的类型,然后忘记它曾经发生过。跨度>
  • 另外,AnyOption 的共同点非常非常少——问题的一部分还不清楚。
  • 关于 Any 和 Option 的问题是,对于他们的展位来说,显然匹配是“最好的”,或者至少是提取它们/确定其价值的最干净/可接受的方式

标签: scala casting type-conversion


【解决方案1】:

原则上,match 是执行代码的最简洁方式,条件是匹配 Any 类型与其他类型。任何 if-else、instanceOf 等链都必然会变得更加繁琐且不那么优雅。一个可能的例外是您知道实际类型是什么并且可以采取相应的行动,在这种情况下可能允许直接强制转换。

也就是说,如果您发现自己多次进行 相同 匹配,您不妨封装匹配以避免代码重复。 partial function 可能正是您所想的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多