rust - 找不到 `rayon` 的箱子

标签 rust dependency-management rust-cargo rust-crates rayon

我正在尝试使用并行化找到 BST 的直径:

extern crate rayon;

use std::cmp::Ordering::*;
use std::ops::Index;
use rayon::prelude::*;

#[derive(Debug)]
struct Node<K> {
    left: Option<Box<Node<K>>>,
    right: Option<Box<Node<K>>>,
    key: K,
}

impl<K> Node<K> {
    fn new(k: K) -> Node<K> {
        Node {
            left: None,
            right: None,
            key: k,
        }
    }
}

impl<K: Ord> Node<K> {
    fn insert(&mut self, n: Node<K>) {
        match n.key.cmp(&self.key) {
            Less => {
                match self.left {
                    None => self.left = Some(Box::new(n)),
                    Some(ref mut l) => l.insert(n),
                }
            }
            Greater => {
                match self.right {
                    None => self.right = Some(Box::new(n)),
                    Some(ref mut r) => r.insert(n),
                }
            }
            _ => {}
        }
    }

    fn height(&self) -> u32 {
        let mut left_he = 1;
        if let Some(ref l) = self.left {
            left_he = 1 + l.height()
        }
        let mut right_he = 1;
        if let Some(ref r) = self.right {
            right_he = 1 + r.height()
        }
        if left_he > right_he {
            return left_he;
        }
        return right_he;
    }

    fn rec(&self) -> u32 {
        let mut le = 0;
        if let Some(ref l) = self.left {
            le = l.height()
        }
        let mut re = 0;
        if let Some(ref r) = self.right {
            re = r.height()
        }
        let hei = le + re + 1;
        let mut led = 0;
        let mut red = 0;

        let Some(ref l) = self.left;

        let Some(ref r) = self.right;

        rayon::join(|| led = l.rec(), || red = r.rec());

        let greater_diameter;
        if red > led {
            greater_diameter = red;
        } else {
            greater_diameter = led;
        }

        if hei > greater_diameter {
            return hei;
        }
        return greater_diameter;
    }

    fn print_recursive(nodes: Vec<&Self>) {
        let mut v: Vec<&Self> = vec![];
        for n in nodes {
            print!("1 ");
            match n.left {
                None => {}
                Some(ref l) => v.push(&*l),
            }
            match n.right {
                None => {}
                Some(ref r) => v.push(&*r),
            }
        }
        println!("");
        if v.len() > 0 {
            Node::print_recursive(v);
        }
    }
}

#[derive(Debug, Default)]
struct Bst<K> {
    root: Option<Box<Node<K>>>,
}
impl<K> Bst<K> {
    fn new() -> Bst<K> {
        Bst { root: None }
    }
}

impl<K: Ord> Bst<K> {
    fn insert(&mut self, k: K) {
        match self.root {
            None => self.root = Some(Box::new(Node::new(k))),
            Some(ref mut r) => r.insert(Node::new(k)),
        }
    }

    fn rec(&self) -> u32 {
        match self.root {
            None => 0,
            Some(ref r) => r.rec(),
        }
    }

    fn print(&self) {
        match self.root {
            None => {}
            Some(ref r) => Node::print_recursive(vec![&*r]),
        };
    }
}

fn main() {
    let mut bst1 = Bst::new();

    bst1.insert(20);
    bst1.insert(21);
    bst1.insert(22);
    bst1.insert(23);
    bst1.insert(24);
    bst1.insert(25);
    bst1.insert(19);
    bst1.insert(18);
    bst1.insert(17);
    bst1.insert(16);
    bst1.insert(15);
    bst1.insert(14);
    bst1.print();

    println!("{}", bst1.rec());
}

当我编译(rustc code.rs)时,它显示

error: can't find crate for `rayon` [E0463]

我的 Rust 版本是 rustc 1.8.0 (db2939409 2016-04-11)

最佳答案

您不能只使用外部依赖而不告诉编译器在哪里可以找到它。最简单的方法是创建一个 Cargo.toml 文件,然后使用 cargo build 来编译您的项目,而不是直接使用 rustc

要创建 Cargo.toml 文件,您只需进入项目目录并键入:

cargo init --bin

这会做两件事:

  1. 创建文件 src/main.rs。你应该把你的代码放在这里。
  2. 创建一个 Cargo.toml 文件,Cargo 使用该文件来存储依赖项和其他构建信息

然后您可以编辑 Cargo.toml 以添加 rayon 依赖项。 crates.io page for rayon为您提供确切的信息,您可以将其粘贴到那里。完成后,它应该看起来像这样:

[package]
name = "foo"
version = "0.1.0"
authors = ["singh <singh@singh.com>"]

[dependencies]
rayon = "0.3.1"

一旦准备就绪,您就可以使用以下方法构建项目:

cargo build

或者运行:

cargo run

您可以在 Cargo guide 中获得更多信息.

关于rust - 找不到 `rayon` 的箱子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36808868/

相关文章:

generics - 如何实现 From 将一种结果类型转换为另一种结果类型?

rust - 为什么在具体实现中使用 Self 而不是类型名称?

rust - 如何将在 main 中初始化的变量传递给 Rocket 路由处理程序?

java - 如何从 gradle 项目中删除 java 标准库?

rust-cargo - 在 Cargo 中禁用注册表更新

rust - 为什么不能在同一结构中存储值和对该值的引用?

c# - C++ C# 项目依赖管理

maven - m2e eclipse maven插件依赖管理

installation - 通过 cargo : specified package has no binaries 安装箱子时出错

c++ - 如何在 Rust 中编译和链接 .cpp 文件?