function定义: def 与 fn

mojo 提供了两种function定义的形式,让使用者可以自由使用,一方面兼容python的语法,另一方面则借鉴Rust的规则

def

def 的行为就类似于 python的def使用def时, 不用在宣告变数时标注型别考虑以下程式,在名称前后加上Hi惊叹号。

def foo(word):
word = "Hi, " + word
result = word + "!"
return result

def main():
hello = foo("Hundo")
print(hello)

其中name跟result都被解析成 object型别但其实也可以标注型别,标注起来就会像原本的python在进行type-annotation时一样,只是对于函式内的变数要加上var

def foo(word: String) -> String:
word = "Hi, " + word
var result: String = word + "!"
return result

def main():
hello = foo("Hundo")
print(hello)

word 跟 回传都被标注成String了!

fn

现在考虑另一个function bar,将def 换成fn,对于调用方来说他们没什么差别,就是fn定义的函式变得更加严格了

fn bar(word: String) -> String:
word = "Hi, " + word
var result: String = word + "!"
return result

会发现word不可以被改变, 这是因为fn的不可变特性, 确保了传入的变数不会被意外改动有几种解法,其中一种是不要改动原本的变数

fn bar(word: String) -> String:
var result: String = "Hi, " + word + "!"
return result

另外一种则是加上mut关键字, 让word可变

def main():
var name: String = "Hundo"
hello = bar(name)
print(hello)
print(name)

fn bar(mut word: String = "John") -> String:
word = "Hi, " + word
var result: String = word + "!"
return result

这样就是函式的基本概念了,其实只要稍微注意

特性
def
fn
型别 可选标注 必需标注
可变性 可变 不可变

Mojo中的函式还有其他功能跟特性,后续的文章会再提到