Rust中如何在new关联函数内访问结构体字段并派生公钥?
解决方案
在Rust里,结构体初始化表达式的字段之间无法互相引用——因为此时结构体还未完成实例化,self也不存在。你需要先单独生成私钥,再基于它派生公钥,最后完成结构体的构造。
修正后的代码如下:
use k256::{SecretKey, PublicKey, Secp256k1}; use rand_core::OsRng; pub struct Wallet { private_key: SecretKey<Secp256k1>, public_key: PublicKey<Secp256k1>, } impl Wallet { pub fn new() -> Wallet { // 1. 先生成随机私钥 let private_key = SecretKey::random(&mut OsRng); // 2. 从私钥派生对应公钥 let public_key = private_key.public_key(); // 3. 构造并返回Wallet实例 Wallet { private_key, public_key, } } }
实例化代码可以正常运行:
let wallet = Wallet::new();
原写法报错的原因
结构体初始化时,每个字段的表达式都是独立求值的,你无法在public_key的表达式里引用同一个初始化列表里的private_key——这个变量还没被绑定到结构体字段,甚至在当前初始化的作用域里都不存在。而self仅能在已实例化结构体的方法中使用,关联函数new是在创建实例的过程中,自然没有可用的self。
其他可选实现模式
如果后续需要支持更多可配置的构造参数,可以使用构建器模式,不过当前场景下分步生成字段的方式已经足够简洁:
impl Wallet { pub fn builder() -> WalletBuilder { WalletBuilder::default() } } #[derive(Default)] struct WalletBuilder { // 可添加需要配置的参数,比如自定义随机源等 } impl WalletBuilder { pub fn build(self) -> Wallet { let private_key = SecretKey::random(&mut OsRng); let public_key = private_key.public_key(); Wallet { private_key, public_key, } } } // 使用方式 let wallet = Wallet::builder().build();
内容的提问来源于stack exchange,提问作者zkharit
相关产品推荐
相关产品推荐

