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

如何用Rust Trait实现无依赖逻辑?对应Python Protocol场景

在Rust中实现类似Python Protocol的独立形状比值计算

核心思路

Rust是名义类型系统,无法直接实现Python那样的结构类型协议,但可以通过将约束Trait放在独立公共模块的方式,让get_ratio函数、Square、Circle三者互相不依赖,仅依赖公共Trait模块,达到和Python Protocol等价的类型检查与解耦效果。

实现步骤

1. 定义公共Trait模块

创建独立模块作为三方的依赖桥梁,定义所需的方法约束:

// shape_traits.rs
pub trait HasAreaAndPerimeter {
    fn area(&self) -> f64;
    fn perimeter(&self) -> f64;
}

2. 实现形状结构体与Trait

每个形状结构体在自身模块中实现公共Trait,无需知晓get_ratio的存在:

Square模块

// square.rs
use crate::shape_traits::HasAreaAndPerimeter;

pub struct Square {
    side_length: f64,
}

impl Square {
    pub fn new(side_length: f64) -> Self {
        Self { side_length }
    }
}

impl HasAreaAndPerimeter for Square {
    fn area(&self) -> f64 {
        self.side_length * self.side_length
    }

    fn perimeter(&self) -> f64 {
        4.0 * self.side_length
    }
}

Circle模块

// circle.rs
use crate::shape_traits::HasAreaAndPerimeter;

pub struct Circle {
    radius: f64,
}

impl Circle {
    pub fn new(radius: f64) -> Self {
        Self { radius }
    }
}

impl HasAreaAndPerimeter for Circle {
    fn area(&self) -> f64 {
        std::f64::consts::PI * self.radius * self.radius
    }

    fn perimeter(&self) -> f64 {
        2.0 * std::f64::consts::PI * self.radius
    }
}

3. 编写比值计算函数

get_ratio仅依赖公共Trait,无需知晓具体形状结构体的实现细节:

// ratio_calculator.rs
use crate::shape_traits::HasAreaAndPerimeter;

// 两种写法等价:impl Trait 语法更简洁,泛型写法更灵活
pub fn get_ratio(shape: &impl HasAreaAndPerimeter) -> f64 {
    shape.area() / shape.perimeter()
}

// 泛型写法:
// pub fn get_ratio<T: HasAreaAndPerimeter>(shape: &T) -> f64 {
//     shape.area() / shape.perimeter()
// }

4. 调用示例

在主模块中整合所有部分,验证功能:

// main.rs
mod shape_traits;
mod square;
mod circle;
mod ratio_calculator;

use square::Square;
use circle::Circle;
use ratio_calculator::get_ratio;

fn main() {
    let square = Square::new(1.0);
    println!("正方形比值: {}", get_ratio(&square)); // 输出 0.25

    let circle = Circle::new(1.0);
    println!("圆形比值: {}", get_ratio(&circle)); // 输出 ~0.159
}

解耦验证

  • Square和Circle仅依赖公共Trait模块,无需知道get_ratio的存在
  • get_ratio仅依赖公共Trait模块,无需知道具体形状的实现细节
  • Rust编译器会自动检查所有传入get_ratio的类型是否符合HasAreaAndPerimeter的方法签名约束

内容的提问来源于stack exchange,提问作者PEJB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:38:17