从另一个静态方法调用trait静态方法(rust)

jchrr9hc  于 2022-12-19  发布在  其他
关注(0)|答案(3)|浏览(187)

你可以从trait中实现的trait静态方法调用一个trait静态方法吗?例如:

trait SqlTable {
  fn table_name() -> String;

  fn load(id: i32) -> Something {
    ...
    Self::table_name()    // <-- this is not right
    ...
  }
}

这是现在的工作感谢克里斯和Arjan(见下面的评论/答案)

fn main() {
  let kiwibank = SqlTable::get_description(15,None::<Account>);
}

trait SqlTable {
    fn table_name(_: Option<Self>) -> String;

    fn get_description(id: i32, _: Option<Self>) -> String {
        println!("Fetching from {} table", SqlTable::table_name(None::<Self>) );
        String::from_str("dummy result")
    }
}

struct Account {
    id: i32,
    name: String,
}
impl SqlTable for Account {
    fn table_name(_: Option<Account>) -> String { String::from_str("account") }
}
eiee3dmh

eiee3dmh1#

您必须将Self更改为SqlTable:

trait SqlTable {
  fn table_name() -> String;

  fn load(id: i32) -> Self {
    ...
    SqlTable::table_name()    // <-- this is not right
    ...
  }
}

静态方法总是在SomeTrait::some_method()这样的trait上调用。Bug #6894涵盖了这个问题。

j9per5c4

j9per5c42#

  • 是的,你可以从一个trait静态方法[在trait中实现]调用另一个trait静态方法[由类型实现]。
  • 静态方法总是在像SomeTrait::some_method()这样的trait上调用。
  • 如果[a trait]函数签名中没有Self或self,那么它目前是不可调用的。在UFCS出现之前,标准的解决方案是接受一个参数_: Option<Self>并将其传递给None::<T>

查看原始问题了解(截至今天)编译的代码。

n3ipq98p

n3ipq98p3#

这在当前Rust(使用1.65.0验证)中无需任何变通方法即可工作:

trait Trait {
    fn x() -> i32 {
        1
    }
}

struct Struct {
    y: i32,
}

impl Struct {
    fn new(y: i32) -> Self {
        Self { y }
    }

    fn f(self) -> i32 {
        Self::x() + self.y
    }
}

impl Trait for Struct {}

fn main() {
    assert_eq!(Struct::new(1).f(), 2);
}

相关问题