我目前正在學習Kotlin並嘗試創建適用於所有number types(Byte
,Long
,Float
等)的擴展(中綴)方法。它應該像Python的%
操作:如何在Kotlin中爲每個數字類型實現地板模數?
4 % 3 == 1 // only this is the same as Java's %
4 % -3 == -2
-4 % 3 == 2
-4 % -3 == -1
...或者像Java的Math.floorMod
,但也要與Double
或Float
工作:
-4.3 % 3.2 == 2.1000000000000005
或與這些類型的任何可能的組合
3 % 2.2 == 0.7999999999999998
3L % 2.2f == 0.7999999999999998
以下按預期工作,但只適用於兩個Double
或兩個Int
:
inline infix fun Double.fmod(other: Double): Number {
return ((this % other) + other) % other
}
inline infix fun Int.fmod(other: Int): Number {
return ((this % other) + other) % other
}
// test
fun main(args: Array<String>) {
println("""
${-4.3 fmod 3.2} == 2.1000000000000005
${4 fmod 3} == 1
${+4 fmod -3} == -2
${-4 fmod 3} == 2
${-4 fmod -3} == -1
""")
}
更換Int
與Number
,我收到以下錯誤信息:
Error:(21, 18) Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@InlineOnly public operator inline fun BigDecimal.mod(other: BigDecimal): BigDecimal defined in kotlin
Error:(21, 27) Public-API inline function cannot access non-public-API 'internal open fun <ERROR FUNCTION>(): [ERROR : <ERROR FUNCTION RETURN TYPE>] defined in root package'
Error:(21, 36) Public-API inline function cannot access non-public-API 'internal open fun <ERROR FUNCTION>(): [ERROR : <ERROR FUNCTION RETURN TYPE>] defined in root package'
我怎樣才能做到這一點對於沒有複製粘貼此每一個數字類型,爲每個類型的組合?
抽象類'Number'沒有成員函數,名爲'mod'也不是'plus'。這可能是錯誤的原因。 – EPadronU
不內聯操作員,它可能會減慢執行速度 – voddan
@voddan由於不需要函數調用,是否存在內聯以提高性能? – Joschua