今天继续学习HOH水分子社区的视频课程,了解了函数的方方面面。函数在Move语言中扮演着“执行者”的角色,是处理各种操作和业务逻辑的核心模块。在这篇学习笔记中,我们将深入探讨Move语言的函数(Function)、表达式(Expression)、控制流(ControlFlow)以及结构方法(St
今天继续学习 HOH 水分子社区的视频课程,深入探索了 Move 语言中的函数设计、表达式、控制流和结构方法。函数在 Move 中是实现逻辑的核心,就像一台机器,灵活地加工输入并产出结果。在这篇笔记中,我们将全面学习这些概念,并结合高级用法及实际场景,为智能合约开发奠定坚实的基础。
函数是 Move 的基本操作单元,完成输入到输出的映射。其基本结构如下:
public fun function_name(param1: Type1, param2: Type2): ReturnType {
// 函数体
}
public
:访问修饰符,决定函数是否可被外部调用。示例:
module ExampleModule {
public fun multiply(x: u64, y: u64): u64 {
x * y
}
}
此函数接收两个 u64
类型参数,返回它们的乘积。这个简单的乘法函数可以用在支付计算或奖励分发中。
Move 支持泛型函数,允许函数处理多种数据类型。通过使用类型参数,可以让函数更具灵活性。
public fun swap<T>(a: &mut T, b: &mut T) {
let temp = *a;
*a = *b;
*b = temp;
}
T
允许此函数交换任意类型的值,而不仅限于特定类型。Move 不直接支持默认参数,但可以通过函数重载实现类似效果:
public fun greet_with_name(name: vector<u8>): vector<u8> {
b"Hello, ".concat(&name)
}
public fun greet(): vector<u8> {
greet_with_name(b"Guest")
}
greet
方法是简化版本,默认参数为 “Guest”。
表达式是代码逻辑的核心,Move 支持多种表达式形式,结合优雅的设计规则,既简洁又安全。
true, 100, b"abc"
。x
。add(1, 2)
。a + b, x / y
。public fun calculate_tax(income: u64): u64 {
if (income > 50_000) {
income * 20 / 100
} else {
income * 10 / 100
}
}
public fun divide_and_remainder(a: u64, b: u64): (u64, u64) {
(a / b, a % b)
}
public fun example_usage() {
let (quotient, remainder) = divide_and_remainder(10, 3);
}
控制流是程序逻辑的核心。Move 支持条件分支和循环,以实现复杂流程。
public fun classify(x: u64): vector<u8> {
if (x > 100) {
b"High"
} else if (x > 50) {
b"Medium"
} else {
b"Low"
}
}
match
是 Move 中类似模式匹配的高级控制流工具,比 if-else
更优雅且扩展性更强,尤其适合处理枚举类型。
match expression {
pattern1 => action1,
pattern2 => action2,
_ => default_action,
}
expression
:匹配的值,可以是变量或表达式。pattern
:匹配条件。action
:匹配成功后执行的代码块。_
:通配符,匹配所有未覆盖的情况。module OrderModule {
enum OrderStatus {
Pending,
Processing,
Shipped,
Completed,
}
public fun get_order_status_message(status: OrderStatus): vector<u8> {
match status {
OrderStatus::Pending => b"Your order is pending.",
OrderStatus::Processing => b"Your order is being processed.",
OrderStatus::Shipped => b"Your order has been shipped.",
OrderStatus::Completed => b"Your order is completed.",
_ => b"Unknown status.",
}
}
}
module NestedMatchExample {
struct Result {
value: u64,
error: bool,
}
public fun handle_result(result: Result): vector<u8> {
match result {
Result { value, error: false } if value > 100 => b"Large value and no error.",
Result { value, error: false } => b"Value is okay and no error.",
Result { value: _, error: true } => b"An error occurred.",
_ => b"Unexpected state.",
}
}
}
public fun fibonacci(n: u64): u64 {
let mut a = 0;
let mut b = 1;
let mut i = 0;
loop {
if (i >= n) {
break;
}
let temp = a + b;
a = b;
b = temp;
i = i + 1;
}
a
}
public fun sum_recursive(n: u64): u64 {
if (n == 0) {
0
} else {
n + sum_recursive(n - 1)
}
}
通过在方法中返回 &mut Self
或新的实例,支持链式调用。
module BankModule {
struct Account has key {
balance: u64,
}
public fun new_account(initial_balance: u64): Account {
Account { balance: initial_balance }
}
public fun deposit(&mut self, amount: u64): &mut Self {
self.balance = self.balance + amount;
self
}
public fun withdraw(&mut self, amount: u64): &mut Self {
if (self.balance >= amount) {
self.balance = self.balance - amount;
}
self
}
public fun reset(&mut self): &mut Self {
self.balance = 0;
self
}
}
public fun example_usage() {
let mut account = BankModule::new_account(1000);
account.deposit(500).withdraw(300).reset();
assert!(account.balance == 0, b"Balance should be zero after reset.");
}
通过本次学习,我们系统地掌握了 Move 函数、表达式、控制流、match
的使用以及结构方法链式调用的高级技巧。Move 强调安全性与高效性,是区块链智能合约开发的强大工具。
请用微信关注《HOH水分子》公众号,我们将持续分享和制作变成语言教程,让大家对编程产生化学反应。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!