Introduction
Functions
fun aFunction(arg1: Arg1Type, optionalArg: OptionalArgType = defaultVal): ReturnType {
// ...
}
fun printStuff(stuff: String, prefix: String = "Info") {
print("[$prefix] $stuff")
}
fun main() {
// Many valid ways to call printStuff
print("thing")
print("thing", "hello")
print(stuff = "thing", prefix = "hello")
print(prefix = "hello", stuff = "thing")
}
```
## [Infix Functions](https://kotlinlang.org/docs/functions.html#infix-notation): `infix`
Member and extension functions with a single parameter can be turned into `infix` functions (calling it doesn't require a dot or parentheses)
> Almost in a way making your own keywords? Probably how Boolean or is just '`or`'
```kotlin
infix fun Int.times(str: String) = str.repeat(this)
println(2 times "Bye ")
Bye Bye
Operator Overloading
In an addition to infix functions, using the operator
keyword with some special names will overload an operator symbol
operator fun Vector.plus(v2: Vector) = Vector(this.x + v2.x, this.y + v2.y)
println(aVector + anotherVector)
Varargs
A funky kind of inline array? Come back to this.
The mechanism by which listOf()
works, I think
Class Declarations
In Kotlin, both the header and the body are optional, since the compiler can build the constructor and appropriate getters/setters for you
// All valid class declarations
class Customer
// a default constructor is inferred
class Contact(val id: Int, var email: String)
// builds a constructor
fun main() {
val contact = Contact(1, "[email protected]")
println(contact.email)
contact.email = "[email protected]"
println(contact.email)
}
Note: new
keyword doesn't exist in Kotlin
Inheritance
Classes and functions are final by default in Kotlin. If you want one to be able to be overriden, mark it with the open
keyword.
open class Dog {
open fun sayHello() {
println("woof")
}
}
class Yorkshire : Dog() {
override fun sayHello() {
println("yip")
}
}
fun main() {
val dog: Dog = Yorkshire()
}
Control Flow
To be continued...