【问题标题】:Deriving Show in a generic struct在通用结构中派生 Show
【发布时间】:2015-02-24 10:38:49
【问题描述】:

我试图理解 Rust 中的一些概念,但我遇到了一个非常简单的问题。我正在尝试定义一个然后要打印的结构。如果我指定组件的类型(在示例中将T 替换为f32),一切都很好。但是,如果我想通用地这样做:

#[deriving(Show)]
struct Point<T> {
    x: T,
    y: T,
    z: T,
}

fn main() {
    let v = Point{x: 3., y: 4., z: 5.,};
    println!("The point is {}" , v);
}

http://play.rust-lang.org/ 中的输出为:

错误:无法推断出足够的类型信息来定位 _ 类型的特征 core::fmt::Show;类型注释 必填

如果我尝试指定类型:

use std::fmt;

#[deriving(Show)]
struct Point<T: std::fmt::Show> {
    x: T,
    y: T,
    z: T,
}

fn main() {
    let v = Point{x: 3., y: 4., z: 5.,};
    println!("The point is {}" , v);
}

输出是:

错误:特征std::fmt::Show 已经出现在边界列表中 [E0127] 以前的出现在这里#[deriving(Show)]

这是为什么?如何解决?

【问题讨论】:

    标签: rust traits bounds


    【解决方案1】:

    3. 不够具体,无法单独命名类型 - 它可以是 f32f64。您可以(至少)通过以下两种方式更加明确:

    let v = Point{x: 3f32, y: 4f32, z: 5f32};
    let v: Point<f32> = Point{x: 3., y: 4., z: 5.};
    

    【讨论】:

    • 我以为我没有指定结构体,而不是我错误地实例化了结构体。
    • @Hernan:第一个错误确实是由于未指定结构的成员引起的。第二个错误似乎是#[deriving(Show)]自动添加Show绑定在T上引起的;通过自己添加它,它最终会出现两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多