Итак, я обертываю биты 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, сохранить описание этого сравнения на основе объектов и передать это описание на сервер. В частности, следующий код скалы:
Worker_Locale == "US"
приведет к добавлению следующих параметров в мой запрос:
&QualificationRequirement.1.QualificationTypeId=000000000000000000L0
&QualificationRequirement.1.Comparator=EqualTo
&QualificationRequirement.1.LocaleValue.Country=US
Так что я не могу переопределить equals
, так как он возвращает Boolean
, и мне нужно вернуть структуру, которая представляет все эти параметры.