Итак, я оборачиваю части API Mechanical Turk, и вам нужно указать квалификационные требования, такие как:
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. Есть ли стандартный обходной путь для этого? Возможно, мне следует просто использовать «===» и «!==» вместо этого?
(Думаю, одним из хороших ответов может быть краткое изложение того, как несколько различных DSL-серверов scala решили обойти эту проблему, и тогда я могу просто делать то же, что и большинство из них.)
Изменить: обратите внимание, что я не пытаюсь выполнить сравнение на равенство. Вместо этого я пытаюсь наблюдать оператор сравнения, указанный пользователем в коде scala, сохранять объектное описание этого сравнения и передавать это описание серверу. В частности, следующий код scala:
Worker_Locale == "US"
приведет к тому, что к моему запросу будут добавлены следующие параметры:
&QualificationRequirement.1.QualificationTypeId=000000000000000000L0
&QualificationRequirement.1.Comparator=EqualTo
&QualificationRequirement.1.LocaleValue.Country=US
Поэтому я не могу переопределить equals
, так как он возвращает Boolean
, и мне нужно вернуть структуру, которая представляет все эти параметры.