gpt4 book ai didi

rust - 如何测试对象的其他特征函数

转载 作者:行者123 更新时间:2023-11-29 08:32:17 25 4
gpt4 key购买 nike

我有一个 Template 结构实现了一个 encoder 函数,该函数返回对 Boxed Encoder 的引用。

我还有一个 FixedEncoder 结构,它实现了 Encoder

我可以创建Template 并得到Encoder,但是如何测试FixedEncoder 的功能?我只是想获取 FixedEncoder 用于测试目的,所以“不安全”的解决方案很好(尽管首选安全的解决方案)

在我下面的例子中我得到了错误

error[E0599]: no method named `length` found for type `&std::boxed::Box<(dyn Encoder + 'static)>` in the current scope

示例(playground):

pub struct Template {
encoder: Box<Encoder>
}

impl Template {
fn new(encoder: Box<Encoder>) -> Template {
Template { encoder }
}

fn encoder(&self) -> &Box<Encoder> {
&self.encoder
}
}

pub trait Encoder {
fn isEncoder(&self) -> bool {
true
}
}

pub struct FixedEncoder {
length: usize
}

impl FixedEncoder {
pub fn new(length: usize) -> FixedEncoder {
FixedEncoder { length }
}

pub fn length(&self) -> usize {
self.length
}
}

impl Encoder for FixedEncoder {}

fn main() {
let fixed_encoder = FixedEncoder::new(1);
let template = Template::new(Box::new(fixed_encoder));
assert_eq!(template.encoder().isEncoder(), true); // works
assert_eq!(&template.encoder().length(), 1); // error[E0599]: no method named `length` found for type `&std::boxed::Box<(dyn Encoder + 'static)>` in the current scope
}

最佳答案

我能够通过使用 Any 来完成此任务。

  1. as_any 声明添加到Encoder
  2. as_any 函数添加到FixedEncoder
  3. 在检索到的编码器上使用.as_any().downcast_ref().unwrap()

playground

use std::any::Any;

pub struct Template {
encoder: Box<Encoder>
}

impl Template {
fn new(encoder: Box<Encoder>) -> Template{
Template {
encoder
}
}
fn encoder(&self) -> &Box<Encoder> {
&self.encoder
}
}

pub trait Encoder {
fn isEncoder(&self) -> bool {
true
}
fn as_any(&self) -> &dyn Any;
}

pub struct FixedEncoder {
length: usize
}
impl FixedEncoder {
pub fn new(length: usize) -> FixedEncoder {
FixedEncoder { length }
}
pub fn length(&self) -> usize {
self.length
}
}



impl Encoder for FixedEncoder {
fn as_any(&self) -> &dyn Any {
self
}
}

fn main() {
let fixed_encoder = FixedEncoder::new(1);
let template = Template::new(Box::new(fixed_encoder));
assert_eq!(template.encoder().isEncoder(), true); // works

let fixed_encoder_from_template : &FixedEncoder = &template.encoder().as_any().downcast_ref().unwrap();
assert_eq!(&fixed_encoder_from_template.length, &(1 as usize));
}

关于rust - 如何测试对象的其他特征函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53307834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com