gpt4 book ai didi

rust - 如何将不同的类实例分配给 Rust 中的变量?

转载 作者:行者123 更新时间:2023-11-29 08:12:02 27 4
gpt4 key购买 nike

<分区>

我正在尝试用 Rust 创建一个简单的程序(用于教育目的)。目前,我主要使用 Java 等经典 OOP 语言进行开发,所以我知道我可能无法在 Rust 中实现同样的事情。

我试图通过根据外部(用户触发的)输入初始化变量然后调用此对象实例上的方法来避免重复代码。

我搜索了一段时间的答案,但我无法为我的问题找到明确的答案。

为了说明我的问题,我用 Java 编写了以下几行:

interface Command {
String getName();
}

class FirstCommand implements Command {
@Override
public String getName() {
return "First command";
}
}

class SecondCommand implements Command {
@Override
public String getName() {
return "Second command";
}
}

public class Test {
public static void main(String[] argv) {
Command cmd;
if (argv.length > 10) {
cmd = new SecondCommand();
} else {
cmd = new FirstCommand();
}
System.out.println(cmd.getName());
}
}

这与我想在 Rust 中实现的基本相同。据我所知,traits 是 Rust 等同于 Java 中的 interfaces。所以我尝试在 Rust 中做同样的事情:

use std::env;

struct FirstCommand {}
struct SecondCommand {}

trait Command {
fn get_name() -> &'static str;
}

impl FirstCommand {
fn new() -> FirstCommand {
FirstCommand {}
}
}

impl Command for FirstCommand {
fn get_name() -> &'static str {
"First command"
}
}

impl SecondCommand {
fn new() -> SecondCommand {
SecondCommand {}
}
}

impl Command for SecondCommand {
fn get_name() -> &'static str {
"Second command"
}
}

fn main() {
let args: Vec<String> = env::args().collect();

let cmd: Command = if args.len() > 10 {
FirstCommand::new()
} else {
SecondCommand::new()
};

cmd.get_name()
}

如果我现在正在尝试编译代码。我收到以下错误消息:

38 |     let cmd: Command = if args.len() > 10 {
| ^^^^^^^ the trait `Command` cannot be made into an object

我尝试了同样的方法,但没有为 cmd 明确定义类型。这导致

38 |       let cmd = if args.len() > 10 {
| _______________-
39 | | FirstCommand::new()
| | ------------------- expected because of this
40 | | } else {
41 | | SecondCommand::new()
| | ^^^^^^^^^^^^^^^^^^^^ expected struct `FirstCommand`, found struct `SecondCommand`
42 | | };
| |_____- if and else have incompatible types

有人可以提示我如何在 Rust 中实现 Java 示例吗?

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