Rust中的特征和实现

 Caroline19921009 发布于 2023-02-04 16:06

我有以下类型:

trait Monster {
    fn attack(&self);
    fn new(int) -> Self;
}

struct CookiesMonster {
    cookies: int,
    hungry_level: int,
}

impl Monster for CookiesMonster {
    fn new(i: int) -> CookiesMonster {
        CookiesMonster { cookies: i, hungry_level: i + 1 }
    }

    fn attack(&self) {
        println!("I have {:d} cookies!!", self.cookies)
    }
}

struct Dummy {
    count: int
}

impl Dummy {
    fn new(i: int) -> Dummy {
        Dummy { count: i }
    }
}

现在,这有效:

let monster: CookiesMonster = Monster::new(10);
let dummy = Dummy::new(10);

但这不是:

let monster = CookiesMonster::new(10);

为什么我不能直接在CookiesMonster类型上调用新方法?

2 个回答
  • 因为这就是特质目前的工作方式.必须在特征上调用特征中的静态方法,而不是在特征的实现者上调用.

    2023-02-04 16:08 回答
  • 请注意,调用特征而不是实现特征的类型上的方法允许这样的情况明确:考虑是否将以下代码添加到您的示例中:

    trait Newable {
        fn new(int) -> Self;
    }
    
    impl Newable for CookiesMonster {
        fn new(i: int) -> CookiesMonster {
            CookiesMonster { cookies: i, hungry_level: 0 }
        }
    }
    

    在这种情况下,Monster::new仍然有效,但CookiesMonster::new会含糊不清.

    (在这个例子中,它的数字如何,其执行的性状使用基于类型推理.广义的语法,如Trait::<for Type>::static_method已作为一种明确写下自己的意图进行了讨论,但我不知道多远沿着这是.)

    大约2014年7月15日更新:"统一函数调用语法"提案跟踪上一段中提到的工作.请参阅Rust RFC PR 132.我的理解是,RFC中描述的UFCS实际上允许你写入CookiesMonster::new何时Monster是(1.)提供new方法和(2.)明确实现的范围内唯一的特征CookiesMonster.

    2023-02-04 16:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有