本文将探讨如何在 Rust 和 Solana 中实现类似 Solidity 的函数可见性,以及如何通过模块化复用来模拟“继承”。
本文将探讨如何在 Rust 和 Solana 中实现类似 Solidity 的函数可见性,以及如何通过模块化复用来模拟“继承”。Solidity 中有四种函数可见性:
我们将在 Solana 中实现类似功能。
之前教程中定义的所有函数默认是公共的:
pub fn my_public_function(ctx: Context<Initialize>) -> Result<()> {
Ok(())
}
使用 pub 关键字标记函数为公共。在 #[program] 模块内,所有函数必须声明为 pub,否则无法编译。
在 Solana 中,程序内部调用自身公共函数并不常见。因此,pub 函数更接近 Solidity 的 external 函数。若需在程序内部调用,建议将逻辑封装为私有函数,再由公共函数调用。
虽然 #[program] 模块内的函数必须是 pub,但文件或模块级别可以定义非 pub 函数。示例:
use anchor_lang::prelude::*;
declare_id!("F26bvRaY1ut3TD1NhrXMsKHpssxF2PAUQ7SjZtnrLkaM");
#[program]
pub mod func_test {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
let u = get_a_num(); // 调用私有函数
msg!("{}", u);
Ok(())
}
}
fn get_a_num() -> u64 { // 文件级私有函数
2
}
#[derive(Accounts)]
pub struct Initialize {}
说明:get_a_num 未使用 pub,仅在文件内可见。
Rust 不是面向对象语言,没有 Solidity 的“类”概念,可见性通过模块系统管理,详见 Rust 文档 - 可见性与隐私。
内部函数在模块及其子模块或导入它的模块中可见:
use anchor_lang::prelude::*;
declare_id!("53hgft52DHUKMPHGu1kusuwxFGk2T8qngwSw2SyGRNrX");
#[program]
pub mod func_visibility {
use super::*;
pub fn initialize(_ctx: Context<Initialize>) -> Result<()> {
some_internal_function::internal_function(); // 调用内部函数
Ok(())
}
pub mod some_internal_function {
pub fn internal_function() { // 模块内公开
// 内部逻辑
}
}
}
mod do_something {
use crate::func_visibility;
pub fn some_func_here() {
func_visibility::some_internal_function::internal_function(); // 外部访问
}
}
#[derive(Accounts)]
pub stru...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!