十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sway 内部库(Internal Libraries)完全指南:使用 mod 与 use 组织同一 `src` 目录下的代码模块

Sway 内部库(Internal Libraries)完全指南:使用 mod 与 use 组织同一 `src` 目录下的代码模块 Sway 内部库Internal Libraries完全指南使用 mod 与 use 组织同一src目录下的代码模块【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway本篇指南聚焦 Sway 语言中内部库Internal Libraries的组织方式与使用流程当一个库文件与程序主文件位于同一个src目录时如何通过mod关键字将其引入作用域再通过use关键字按需导入其中公开的项。读完本文你将掌握内部库的目录结构约定、mod/use两步导入法、pub可见性规则以及如何在 Fuel 合约/脚本/库项目中实际复用同一目录下的代码模块。什么是内部库在 SwayFuel 生态的智能合约语言中库Library是用来封装常用操作、避免代码重复的代码单元文件以library关键字开头定义见 库的官方文档。所谓内部库Internal Library指的是与该项目的其他程序文件位于同一个src源目录下的库文件。它不需要在Forc.toml中声明为外部依赖而是直接作为项目内部的子模块被引用——这是它与外部库External Libraries位于src目录之外、通常是另一个独立项目的库最本质的区别。内部库的典型目录结构如下出自 internal.md$ tree . ├── Cargo.toml ├── Forc.toml └── src ├── lib.sw └── my_library.sw其中lib.sw是该库或程序的入口文件my_library.sw则是位于同一src目录下的内部库文件。两步导入法moduse要在lib.sw中使用位于同一目录的my_library.sw需要完成两个步骤使用mod关键字将库引入作用域写法是mod后跟库文件名不含.sw后缀使用use关键字从库中按需导入各项内容。以下代码来自仓库中的配套示例 lib.swlibrary; mod my_library; use my_library::bar; // bar from my_library is now available throughout the file执行流程可以这样理解mod my_library;让编译器找到并加载src/my_library.sw这个文件作为当前模块的子模块随后use my_library::bar;把该模块中公开的bar函数带入当前作用域之后整个文件都可以直接调用bar无需再写完整的my_library::bar路径。配套的 my_library.sw 内容如下它展示了内部库中可以定义哪些内容、哪些内容可以被外部导入library; // Cannot import because the pub keyword is missing fn foo() {} // Can import everything below because they are using the pub keyword pub const ONE __to_str_array(1); pub struct MyStruct {} impl MyStruct { pub fn my_function() {} } pub enum MyEnum { Variant: (), } pub fn bar() {} pub trait MyTrait { fn my_function(); }可以看到foo函数因为没有pub修饰属于库内部私有实现而ONE常量、MyStruct结构体、MyEnum枚举、bar函数与MyTraittrait 均被标记为pub因此可以被use导入。pub可见性内部库的公开边界理解内部库的导入机制必须同时理解 Sway 的可见性规则。根据库文档中的 Accessibility 章节Sway 项目中定义的所有代码包括库内部代码默认都是**私有private**的对其他文件不可见除非被显式暴露。代码对外暴露需要经过两步在代码声明前添加pub关键字如果是对外部库的访问还需在Forc.toml中将该库声明为依赖再导入带pub的声明内部库属于同项目模块无需此步直接moduse即可。可以被标记为pub的结构包括全局定义的常量Globally defined constants结构体Structs枚举Enums函数FunctionsTraitTraits这一点在配套示例的注释中也得到了印证// Cannot import because thepubkeyword is missing明确说明缺失pub的foo()无法被其他文件导入。在真实项目中查看内部库的实际应用仓库中的示例工程大量使用了内部库的组织方式。例如 examples/enums/src/main.swlibrary; mod basic_enum; mod enum_of_structs; pub mod enum_of_enums; mod enums_avoid; mod enums_preferred;这是一个库项目main.sw即入口lib.sw通过mod关键字把同一目录下的多个内部库文件组织进来。值得注意的是pub mod enum_of_enums;展示了另一个进阶用法mod声明本身也可以携带pub修饰从而将整个子模块对外公开允许下游使用者通过use enums::enum_of_enums::...进一步访问。类似的例子还包括 examples/cei_analysis/src/main.sw、examples/converting_types/src/main.sw、examples/identity/src/main.sw 和 examples/structs/src/main.sw它们都以mod形式组织多文件代码可作为内部库实战的参考模板。内部库的依赖与项目配置尽管内部库不需要像外部库那样在Forc.toml中声明依赖但承载它的项目本身仍然需要正确的清单配置。配套示例的 Forc.toml 展示了典型配置[project] authors [Fuel Labs contactfuel.sh] entry lib.sw license Apache-2.0 name my_lib [dependencies] std { path ../../../../../../../../../sway-lib-std }其中entry lib.sw指明项目入口为lib.sw[dependencies]中通过路径方式引入标准库std即仓库根目录下的 sway-lib-std。注意内部库文件如my_library.sw不需要出现在依赖列表中——它由mod声明直接解析这正是内部库与外部库在配置层面的关键差异。作为对比外部库需要在[dependencies]中显式声明例如 外部库示例 中的my_other_library { path ../my_other_library }。部署说明内部库本身不能直接部署到区块链上但它可以作为合约Contract的一部分随合约一同部署。也就是说库代码会被编译进最终部署的合约字节码中为合约提供复用逻辑而库文件自身并不是一个独立的部署单元。这一规则与库类型的通用特性一致内部库的组织方式不会改变库的部署语义。小结内部库是 Sway 项目中最常见的代码组织手段适用于把同一src目录下的辅助代码工具函数、数据结构、枚举、trait 定义等拆分成独立文件再在入口文件中通过mod引入、use按需导入。掌握这一模式需要注意三点目录约束内部库必须与使用它的文件位于同一src目录下两步导入先mod file_name引入模块再use module::item导入具体项可见性只有标记pub的项才能被导入未加pub的项默认为库内部私有。通过合理拆分内部库并配合pub可见性设计可以在保持代码整洁的同时实现模块间清晰的依赖边界与复用能力。【免费下载链接】sway Empowering everyone to build reliable and efficient smart contracts.项目地址: https://gitcode.com/GitHub_Trending/sw/sway创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表