Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Как на уровне байткода будут выглядеть геттеры и сеттеры в Kotlin?
getVarName() и setVarName(...) += в scala достаточно создать метод с очевидным названием "+=", причём нет никаких ограничений на тип и количество аргументов — это самый обычный метод, а не какая-то дополнительная сущность. operator fun plusAssign , что не совсем интуитивно (приходится вспоминать, что и как называется), и есть ограничения — метод не может возвращать значение. def methodName(...) = {...} Или, например, синтаксис объявления метода:В скале на самом деле тоже есть синтаксис без "=", но он deprecated.
В scala: def methodName(...) = {...}
В Scala похожая функциональность сделана через implicit-преобразования, из-за чего при вызове создаётся ещё один объект.В scala есть extends AnyVal. Для таких классов тоже не создается экземпляров, если это возможно.
Можно написать пару маленьких программок и декомпилировать.
геттеры и сеттеры будут реализованы как методы getVarName() и setVarName(...)
Null-safety: интересная штука, но на практике во все публичные методы добавляются проверки для каждого аргумента на null. Мне кажется несколько избыточным — и есть подозрение, что это негативно влияет на производительность. (Там не просто проверка, а вызов статического метода с передачей объекта-параметра и его имени как строки, чтобы можно было кинуть понятное исключение)
fun func():Int = 10
// и
fun func():Int { return 10 }fun func():Int = { 10 }fun test(){ println("it works") }
fun test2() = println("it works too")
fun test3() = {println("surprise!")}fun passTen(func: (Int)->Int ): ()->Int {
return { func(10) }
}import A.B
import A.C
sealed class A<T> {
class B<T>(val c: A<T>, val d: A<T>): A<T>() {
override fun toString(): String = "($c $d)"
}
class C<T>(val e: T): A<T>() {
override fun toString(): String = "$e"
}
}
fun main(args: Array<String>) {
val f = B(C(1), B(C(2), C(3)))
println("$f")
}
import BinaryTree.Node
import BinaryTree.Leaf
sealed class BinaryTree<T> {
class Node<T>(val left: BinaryTree<T>, val right: BinaryTree<T>): BinaryTree<T>() {
override fun toString(): String = "($left $right)"
}
class Leaf<T>(val value: T): BinaryTree<T>() {
override fun toString(): String = "$value"
}
}
fun main(args: Array<String>) {
val tree = Node(Leaf(1), Node(Leaf(2), Leaf(3)))
println("$tree")
}
Когда тип указывается до имени, то двоеточия не нужно, читабельность выше. Ты сразу понимаешь с чем работаешь, а потом уже смотришь на имя.
Статически типизированный код:
class Actor
def do_it( a, b )
just_todos = {
"remark" => ->self.remark(String | Int32),
"accept" => ->self.accept(String | Int32),
}
just_todos[a](b)
end
def remark(p)
puts p
end
endЯзык?
Думаю, это то, что ждет Kotlin, — автоматический вывод типов параметров и результатов, где возможно.
Немного о Kotlin