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)
但这并不是那么清晰
答案 0 :(得分:1)
Kotlin确实有这些功能,但不是你想到的形式。 Kotlin是一种通用编程语言,它是OOP和FP的混合,而不是域特定语言。 Kotlin倾向于通过函数解决问题,而不是运算符/语言结构。例如,kotlin使用filter
函数来实现SQL where
子句的功能。
然而,其中一些功能实际上是模仿内置语言结构。 子>
fooCollection.filter {it.bar > 0}
在上面的代码fooCollection
中是Collection<Foo>
(Foo
是从表foo
的记录映射的POJO / java bean。)
如果您对上面发布的任何内容不清楚,请通过以下评论告诉我。