You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:59:57