我正在Rust中制作一个OOP聊天客户端。模块messages.rs创建并处理作为结构的其他模块的消息:SimpleMessage
和ComplexMessage
结构:
//! # Messages
use time::SteadyTime;
/// Represents a simple text message
pub struct SimpleMessage<'a> {
pub user: ...
pub time: &'a SteadyTime<'a>,
pub content: &'a str,
}
/// Represents attachments, like text or multimedia files.
pub struct ComplexMessage<'a> {
pub user: ...
pub time: &'a SteadyTime<'a>,
//pub content: PENDING
}
impl<'a> SimpleMessage<'a> { }
impl<'a> ComplexMessage<'a> { }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_simple() {
assert_eq!(&self.instance_of(), SimpleMessage);
}
#[test]
fn is_complex() {
assert_eq!(&self.instance_of(), ComplexMessage);
}
}
我很难找到类似于Java的函数,例如
InstanceOf()
的结构,它可能会像这样工作:&self.instance_of() -> str
这将用于在GUI中处理不同于
ComplexMessage
的SimpleMessage
,并为ComplexMessage
添加预览和下载按钮。有任何想法吗?
最佳答案
首先,如果您尝试将Java OOP习惯用法移植到Rust,您将很难过。 Rust程序员使用完全不同的习惯用法和模式,这些习惯和模式更适合于语言的设计。
也就是说,您可以使用std::any::TypeId
比较类型。类似于instanceOf
的函数可以这样实现:
use std::any::{Any, TypeId};
trait InstanceOf
where
Self: Any,
{
fn instance_of<U: ?Sized + Any>(&self) -> bool {
TypeId::of::<Self>() == TypeId::of::<U>()
}
}
// implement this trait for every type that implements `Any` (which is most types)
impl<T: ?Sized + Any> InstanceOf for T {}
并像这样使用它:
let msg = ComplexMessage::new();
println!("msg is ComplexMessage: {}", msg.instance_of::<ComplexMessage>());
println!("msg is SimpleMessage: {}", msg.instance_of::<SimpleMessage>());
输出:
msg is ComplexMessage: true
msg is SimpleMessage: false
请注意,Rust不像Java那样具有类型继承的概念,因此它只会告诉您它是否完全相同。
如DK在此答案下方所评论的,对问题的更使用rust 的方法是使用
enum
对您有两种消息的事实进行建模。 Rust enum
与Java enum
几乎没有什么不同,它们与struct
一样强大,只是它们对替代方案(而非集合)进行建模。这是使用现有类型并将其包装起来的一种实现方式:enum Message<'a> {
Complex(ComplexMessage<'a>),
Simple(SimpleMessage<'a>),
}
每当函数只能接受
ComplexMessage
时,您都可以编写签名来反射(reflect)这一点:fn send_multimedia(msg: ComplexMessage) { ... }
并且只要您可以接受任何一种类型,请使用
enum
:fn get_msg_size(msg: Message) -> usize {
match(msg) {
Message::Complex(complex) => complex.content.len() + complex.file.size(),
Message::Simple(simple) => simple.content.len(),
}
}
关于oop - Java的instanceof等结构的函数是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52005382/