# Functions

* Functions are declared with the keyword `fn`
* When using **arguments**, you **must declare data types**.
* By default functions **return empty tuple ()**. If you want to return a value, **return type must be specified** after **->**

## Hello world

```rust
fn main() {
    println!("Hello, world!");
}
```

## Passing arguments

```rust
fn print_sum(a: i8, b: i8) {
    println!("sum is: {}", a + b);
}
```

## Returning Values

```rust
fn plus_one(a: i32) -> i32 {
    a + 1 //no ; means an expression, return a+1
}

fn plus_two(a: i32) -> i32 {
    return a + 2; //return a+2 but bad practice,
    //should use only on conditional returnes, except it's last expression
}

// ⭐️ Function pointers, Usage as a Data Type
let b = plus_one;
let c = b(5); //6

let b: fn(i32) -> i32 = plus_one; //same, with type inference
let c = b(5); //6
```
