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
这样就是函式的基本概念了,其实只要稍微注意
型别 | 可选标注 | 必需标注 |
可变性 | 可变 | 不可变 |
Mojo中的函式还有其他功能跟特性,后续的文章会再提到