74 lines
1.3 KiB
Markdown
74 lines
1.3 KiB
Markdown
# Function parameters
|
|
|
|
|
|
## Immutable reference
|
|
|
|
```thp
|
|
fun add_25(Array[Int] numbers) {
|
|
numbers.push(25) // Error: `numbers` is immutable
|
|
}
|
|
```
|
|
|
|
When using a regular type as a parameter, only it's immutable
|
|
properties can be used
|
|
|
|
```thp
|
|
fun count(Array[Int] numbers) -> Int {
|
|
val items_count = numbers.size() // Ok, `size` is pure
|
|
|
|
items_count
|
|
}
|
|
```
|
|
|
|
To use immutable properties you must use a mutable reference.
|
|
|
|
|
|
## Mutable reference
|
|
|
|
```thp
|
|
fun push_25(mut Array[Int] numbers) {
|
|
numbers.push(25) // Ok, will also mutate the original array
|
|
}
|
|
```
|
|
|
|
Placing a `mut` before the type makes the parameter a mutable
|
|
reference. Mutable methods can be used, and the original
|
|
data **can** be mutated.
|
|
|
|
The caller *must* also use `mut`.
|
|
|
|
```thp
|
|
val numbers = Array(0, 1, 2, 3)
|
|
|
|
push_25(mut numbers) // Pass `numbers` as reference.
|
|
|
|
print(numbers(4)) // `Some(25)`
|
|
```
|
|
|
|
|
|
|
|
## Clone
|
|
|
|
```thp
|
|
fun add_25(clone Array[Int] numbers) {
|
|
numbers.push(25) // Ok, the original array is unaffected
|
|
}
|
|
```
|
|
|
|
Using the `clone` keyword before the type creates a mutable copy
|
|
of the parameter (CoW). The original data will **not** be mutated.
|
|
|
|
|
|
```thp
|
|
val numbers = Array(1, 2, 3, 4)
|
|
|
|
add_25(clone numbers) // Pass `numbers` as clone.
|
|
|
|
print(numbers(4)) // None
|
|
```
|
|
|
|
|
|
|
|
|
|
|