В последнее время я много имел дело с мультиплатформенным kotlin, и я полностью понимаю природу разработки. Изначально у меня был собственный ожидаемый класс Math (в общем модуле), и у меня были реальные классы в среде JS и JVM.
Поскольку мне нравится читать документацию, я обнаружил, что библиотека Math была добавлена в стандартную библиотеку начиная с kotlin 1.2. это беспокоит меня, поскольку я использую kotlin 1.2.51, и я получаю сообщение об ошибке при попытке доступа к классу из kotlin.Math в моем общем модуле и в любом из модулей моей платформы.
Что я не понимаю? Как мне получить доступ к классу kotlin.Math в моем общем модуле?
Импортируйте это так: import kotlin.math.*
как, черт возьми, я могу его импортировать, если его там нет?
это не математика. это kotlin.math
. Если вы используете Kotlin 1.2.51 это там
доступны в общих модулях kotlin? если да, то, вероятно, что-то не так с моим stdlib kotlin
какой ide ты используешь?
intelliJ idea 2017.3.2 (Ultimate Edition)
В вашем идеале напишите такую строчку: val a = sqrt(10.0)
. Если ide не предлагает импортировать kotlin.math.sqrt
, вам необходимо обновление.
он также хорошо работает в среде kotlin / js как val a = js ("Math"). sqrt (10.0)
Это так просто.
Класс Math
является устаревшим, и сообщение об устаревании содержит:
Use top-level functions from kotlin.math package instead.
(см. также https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.js/-math/index.html)
Так что почему-то ответ @mTak правильный, хотя об этом не упоминалось, что вы должны использовать kotlin.math.*
-import вместо вашего Math
-класса.
В качестве альтернативы вы также можете импортировать kotlin.math.max
и т. д. В зависимости от того, какая функция вам действительно нужна.
Тем больше я думаю об этом: я не знаю, был ли когда-либо класс Math
в jvm-варианте Kotlin (ничего не нашел относительно этого), поэтому в многоплатформенном проекте доступ к классу Math
, вероятно, должен всегда терпели неудачу.
что ты имеешь ввиду это не было упомянуто?
Вы написали: «Импортируйте это так: import kotlin.math.*
, но там нет класса Math
. В нем отсутствует информация о том, что класс Math
лучше заменить на методы доступа непосредственно в kotlin.math
, которые доступны как для JS, так и для JVM. .
Вы правы относительно всей дополнительной информации, но, поскольку математического класса нет, я предложил единственную альтернативу, которая существует
Это нормально (я не голосовал против). Но вы знаете, что там нет Math
-класса. ОП может не знать. Вы можете добавить эту информацию, иначе ваш "импортировать Это" может быть неправильно истолкован как: ваш класс находится в этом пакете.
В любом случае, я не думаю, что это будет неправильно истолковано, так как это то, что предлагает Котлин.
во-первых, я не могу импортировать, поскольку нет класса Math или kotlin.math, как предлагает @Roland в общем модуле
второй. bsed на [kotlinlang.org/docs/reference/whatsnew12.html], в документации сказано, что они добавили kotlin.math, начиная с kotlin 1.2. Изначально этого не было в общем модуле, поэтому у меня был собственный математический класс.
В стандартной библиотеке Kotlin математические функции предоставляются как функции верхнего уровня в пакете kotlin.math
.
Поэтому вам нужно импортировать этот пакет, и тогда вы сможете использовать из него функции, такие как sin
, sqrt
и так далее.
import kotlin.math.*
val sqrt2 = sqrt(2.0)
Вы также можете импортировать функции по одной, например import kotlin.math.sqrt
или даже называть их полностью квалифицированными val result = kotlin.math.sqrt(2.0)
kotlin.math недоступен в общем модуле
Так должно быть. Проверьте зависимость от библиотеки kotlin-stdlib-common
. Если он там, а вы по-прежнему не видите kotlin.math
, сообщите о проблеме здесь: kotl.in/issue
@andylamax Сообщалось ли вам о каких-либо ошибках, если вы пишете приведенный выше пример кода в своем общем модуле?
Через некоторое время (даже чувствую себя глупо). Я обнаружил, что библиотека kotlin.math в общих модулях kotlin уже добавлена. Единственная разница заключалась в том, что в нем не было «Математики». предшественник, как я обычно привык.
Итак,
Math.round (x: Float) был просто round (x: Float)
Math.sin (x: Float) был просто грехом (x: Float)
Есть ли проблема, о которой я должен знать?