Kotlin имеет ограниченную перегрузку оператора. Я обертываю API, который выполняет операции на основе векторов, поскольку они выполняются на таких языках, как R, Julia, APL и т. Д. Наиболее распространенным примером является SQL, где вы можете сказать:
select * from foo where bar > 3;
так что каждая запись оценивается индивидуально и добавляется к набору результатов, если она проходит сравнение. В Kotlin перегрузка оператора сравнения связана с методом compareTo:
Expression Translated to a > b a.compareTo(b) > 0 a < b a.compareTo(b) < 0 a >= b a.compareTo(b) >= 0 a <= b a.compareTo(b) <= 0 All comparisons are translated into calls to compareTo, that is required to return Int.
Поэтому мне представляется невозможным использовать перегрузку оператора, чтобы выразить векторно-ориентированную операцию сравнения. Я что-то упускаю?
Обходной задачей было бы создание функций с использованием ключевого слова infix, например:
infix fun greaterThan(x: Int)...
который может быть вызван как:
where(bar greaterThan 3)
но это не так хорошо читаемо
У Котлина есть эти особенности, но не в той форме, о которой вы думали. Kotlin – это общий язык программирования, представляющий собой сочетание OOP и FP, а не язык, специфичный для домена. Котлин, как правило, решает задачу функциями, а не операторами / языковыми конструкциями. Например, kotlin использует функцию filter
для достижения того, что делает SQL, where
это делается.
Однако некоторые из этих функций фактически являются mimmening встроенными языковыми конструкциями.
fooCollection.filter {it.bar > 0}
В приведенном выше коде fooCollection
представляет собой Collection<Foo>
(а Foo
– POJO / java bean, отображаемый из записи вашей таблицы foo
).
Если вы не знаете, что я написал выше, пожалуйста, дайте мне знать, комментируя ниже.