gpt4 book ai didi

oop - Rust,相同类型,来自同一模块的单独导入的不同路径

转载 作者:行者123 更新时间:2023-12-03 11:32:35 24 4
gpt4 key购买 nike

我是 Rust 的新手,通过编写我的第一个玩具程序(只是一个纸牌游戏实现)已经有了一些方法。这是我当前的文件结构:

├── Cargo.lock
├── Cargo.toml
├── src
│   ├── card.rs
│   ├── deck.rs
│   ├── hand.rs
│   └── main.rs

基本的构建 block 当然是卡片结构,它看起来像这样:

pub struct Card {
value: Value,
suit: Suit,
is_visible : bool
}

impl Card {
pub fn new(value: &Value, suit: &Suit) -> Card {
Card {...}
}
}
#[derive(Clone)]
pub enum Suit {...}
#[derive(Clone)]
pub enum Value{...}

deck.rs 中的 Deck 实现,使用 card 模块:

#[path="card.rs"]
mod card;
pub use card::*;

pub struct Deck(Vec<Card>);

impl Deck {
pub fn new(n_packs: u32) -> Deck {
let mut cards = Vec::new();
...
Deck(cards)
}
pub fn deal_from_top(&mut self, n_cards: u32) -> Vec<Card>{...}
pub fn shuffle(&mut self) {...}

...
}

非常相似的结构,Hand 定义在模块 hand.rs 中

#[path = "card.rs"]
mod card;
pub use card::*;

pub struct Hand(Vec<Card>);

impl Hand{
pub fn new(cards: Vec<Card>) -> Hand{
Hand(cards)
}
}

在main.rs中,我有想要

  • 创建一个套牌,
  • 洗牌,
  • 发 n 张牌,
  • 将这些牌放入 Hand 结构中

最后一个让我感到非常悲伤。

这是我尝试过的:

mod hand;
mod deck;
use hand::Hand;
use deck::Deck;

fn main() {
let mut deck = Deck::new(1);
deck.shuffle();
let mut cards = deck.deal_from_top(5);
let mut hand = Hand::new(cards);
}

这会引发编译时错误 E0308:

error[E0308]: mismatched types
--> src/main.rs:13:30
|
13 | let mut hand = Hand::new(cards);
| ^^^^^ expected struct `hand::card::Card`, found struct `deck::card::Card`
|
= note: expected struct `std::vec::Vec<hand::card::Card>`
found struct `std::vec::Vec<deck::card::Card>`

很明显,我在理解如何“导入”用户定义类型以供使用时遗漏了一些东西。

通过导入 cards 模块,deck 和 hand 使用的“Card”类型成为独立的类型,如就主要而言。我不希望牌组或手牌相互引用以访问 Card 的相同命名空间版本。

如何使卡片结构在此上下文中完全可重用?还是我有点面向对象的方法太过广泛以至于无法在惯用的 Rust 中实现?到目前为止搜索一无所获。

最佳答案

使用#[path="card.rs"],您可以强制deckhand 模块找到card 模块在非标准的地方。在deck.rshand.rs中,编写mod card;card视为sub前两个的模块。理论上,这些子模块应该位于 src/deck/card.rssrc/hand/card.rs 中,因此 path=在另一个地方找到它们的符号。

取而代之的是,您可能想使用同一级别的 card 模块。只需删除这两个文件中的 mod card; 并编写 pub use super::card::*; 而不是 pub use::card::* ;。最后,在main.rs中添加mod card;,以便编译器读取main.rs时发现。

在您的解决方案中,为两个不同的子模块重用同一个文件只是一个等同于复制/粘贴的技巧,但从语言的角度来看,这两个子模块和它们提供的结构是不同的(正如编译器在错误信息)。

关于oop - Rust,相同类型,来自同一模块的单独导入的不同路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64069463/

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