繁体   English   中英

Scala DSL中final ==和!=(等于和不等于)方法的解决方法

[英]workaround for final == and != (equals and not equals) methods in scala DSL

因此,我包装了Mechanical Turk API的各个部分,您需要指定资格要求,例如:

Worker_Locale == "US"
Worker_PercentAssignmentsApproved > 95
...

在我的代码中,我想允许上面的语法并将其转换为类似以下内容的代码:

QualificationRequirement("00000000000000000071", "LocaleValue.Country", "EqualTo", "US")
QualificationRequirement("000000000000000000L0", "IntegerValue", "GreaterThan", 95)

我可以通过声明一个对象来实现我想要的大多数东西:

object Worker_PercentAssignmentsApproved {
  def >(x: Int) = {
    QualificationRequirement("000000000000000000L0", "IntegerValue", "GreaterThan", x)
  }
}

但是我不能对“ ==”(等于)或“!=”(不等于)方法做同样的事情,因为它们在AnyRef中声明为final。 有标准的解决方法吗? 也许我应该只使用“ ===”和“!==”代替?

(我想一个很好的答案可能是总结了几种不同的scala DSL如何选择解决此问题的方法,然后我可以做大多数事情。)

编辑:请注意,我并不是在尝试实际执行相等比较。 相反,我尝试观察用户在scala代码中指示的比较运算符,保存该比较的基于对象的描述,并将该描述提供给服务器。 具体来说,以下scala代码:

Worker_Locale == "US"

将导致以下参数添加到我的请求中:

&QualificationRequirement.1.QualificationTypeId=000000000000000000L0
&QualificationRequirement.1.Comparator=EqualTo
&QualificationRequirement.1.LocaleValue.Country=US

因此我无法覆盖equals因为它返回一个Boolean ,并且我需要返回一个表示所有这些参数的结构。

如果在scala参考(第12.1节)中查看==!=的定义,您会发现它们是根据eqequals定义的。

eq是引用相等,也是final (在这种情况下,它仅用于检查null ),但是您应该能够覆盖equals

请注意,您可能还需要编写hashCode方法以确保
o1.equals(o2) ,o2与o1.equals(o2)(o1.hashCode.equals(o2.hashCode))

但是,如果您需要DSL以外的其他返回类型,而不是Boolean或具有更大的灵活性,则应该使用=== ,例如在Squeryl中所做的那样

这是各种DSL在这种情况下使用的小调查。

Liftweb在Javascript表达式中使用===

JsIf(ValById("username") === value.toLowerCase, ...)

Squeryl对SQL表达式使用===

authors.where(a=> a.lastName === "Pouchkine")

querydsl对SQL表达式使用$eq

person.firstName $eq "Ben"

Prolog-in-Scala对Prolog表达式使用===

'Z === 'A

Scalatest使用===来获取Option而不是Boolean

assert("hello" === "world")

因此,我认为共识主要是使用===

我一直在考虑类似的问题。 我当时正在考虑创建一个DSL来编写特定于域的公式。 麻烦的是,用户也可能想要进行字符串操作,并且最终得到类似

"some string" + <someDslConstruct>

不管您做什么,它都会像这样

stringToLiteralString("some string" + <someDslConstruct>)

我认为摆脱这种困境的唯一可能方法就是尝试使用 在您的示例中,也许您可​​以拥有一个包装scala表达式并将原始AST转换为查询的宏? 对任意表达式执行此操作并不可行,但是如果您的域受到足够好的约束,则它可能是一个可行的替代解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM