Rust中的::是什么意思?

34

在Rust中,像这里看到的::语法是什么意思:

fn chunk(n: uint, idx: uint) -> uint {
    let sh = uint::BITS - (SHIFT * (idx + 1));
    (n >> sh) & MASK
}

在像Haskell这样的语言中,它表示类型提示,但在这里编译器已经对该值的类型进行了注释,因此似乎很可能是类型转换。


这不是类标识符吗?请看13-19行。 - Burgi
2
注意!您正在链接到非常旧的Rust版本。您应该确保阅读的所有内容都是Rust 1.0 beta或更高版本! - Shepmaster
是的,看起来trie实现从那时起就被删除了,这就是为什么我找不到更新版本的原因。 - heartpunk
1
有一些箱子广告它们实现了Trie。 - Shepmaster
2个回答

41
请查看 The Rust Programming Language 中的 附录 B: 运算符和符号
在这种情况下,双冒号 (::) 是路径分隔符。路径cratemoduleitem 组成。 你的示例项目,在1.0中更新后 的完整路径为:
std::usize::BITS

这里,std 是一个 crate(包),usize 是一个模块,BITS 是一个具体的项 —— 在本例中是一个常量。
如果你在文件中向上滚动,你会看到 use core::usizeuse 将路径添加到要查找的项集合中。这就是你可以仅仅使用 usize::BITS 的原因。 core 包是 std 包外观的实现细节,因此在正常代码中可以将 core 替换为 std

::也可以用作指定泛型类型的一种方式,当它们无法被推断时;这被称为turbofish

另请参阅:


这里的第一个例子关于rlua::Tableset方法的文档似乎不符合这个定义。他们在那里创建了一个变量lua,然后执行lua.exec::<()>(r#"…"#, None)::看起来不像你的例子中的路径。 - Hi-Angel
我在IRC上询问了:结果发现,::<Type>语法用于提供Type参数。这就像C++/C#/Java的模板,只是由于某种原因有一个多余的双冒号。 - Hi-Angel
这里的 ::(路径分隔符和Turbofish)这两种用法有关联吗? - joel
1
那个Turbofish网站很可爱... :P - basicdays

3

抱歉,我没有认真阅读。在这种情况下,它只是指模块下的任何内容的常规方式。uint :: BITS似乎是一个常量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接