不幸的是,Rust的文档where非常缺乏.关键字仅出现在参考中的一个或两个不相关的示例中.
where下面的代码会产生什么语义差异?有什么不同吗?哪种形式更受欢迎?
fn double_a<T>(a:T) -> T where T:std::num::Int {
a+a
}
fn double_b<T: std::num::Int>(a:T) -> T {
a+a
}
Run Code Online (Sandbox Code Playgroud)在CharEq特性的实现中,它似乎where被用作某种"选择器"来为匹配某种闭包类型的任何东西实现Trait.我对么?
有什么方法可以让我得到更好,更完整的图片where吗?(完整的使用和语法规范)
有人可以解释为什么将值移到借来的结构中是有效的,而不是将它们移出去?例如:
struct S {
v: Vec<u8>
}
fn move_v_out(s: &mut S) {
let old_vecotr = s.v; // If removed, program compiles fine
s.v = vec![];
}
fn main() {
let mut v = S {
v: vec![]
};
move_v_out(&mut v);
}
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,都会修改一个可变借入结构的成员.但是,会导致编译错误.
我有一个Rust库,它u8通过FFI 将数组返回给C调用者.该库还在客户端完成后处理数组.该库没有状态,因此客户端需要拥有该数组,直到它被传递回库以供释放.
使用box::from_raw并且boxed::into_raw会很好,但我无法解决如何将数组转换为返回类型的问题.
我已经定义了一个宏来优雅地处理越界切片.以下是宏的定义:
macro_rules! slice_or_else {
($array: expr, $to:expr, $err: block) => ({
if $to <= $array.len() {
&$array[..$to]
}
else $err
})
}
Run Code Online (Sandbox Code Playgroud)
当我使用它编译一个函数时,编译器会抱怨
warning: comparison is useless due to type limits, #[warn(unused_comparisons)] on by default
Run Code Online (Sandbox Code Playgroud)
尽管使用比较确定请求的切片是否有效,以及宏是否通过测试.我错过了什么吗?可以为宏关闭这些警告吗?
更新:看来,通过0为$to引起该问题,如雷姆建议.一个例子(围栏示例):
fn main() {
let a: [u8; 4] = [0, 1, 2, 3];
assert!(slice_or_else!(a, 0, {return;}).len() == 0);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用宏,因为我希望能够影响调用函数的流程.
由于警告是合理的,处理此用例的最佳策略是什么?绑定$to到临时变量?明确地投射它?
我设法找到的最接近的是std::num::Int和std::num::Float 定义的特征zero().但是,它们特定于原始类型.
如果我的理解是正确的,则以下代码应生成一个可执行文件。但是事实并非如此。它已创建,但未应用指定的权限。我究竟做错了什么?
use std::fs;
use std::os::unix::PermissionsExt;
fn main() {
fs::File::create("somefile").unwrap()
.metadata().unwrap()
.permissions()
.set_mode(0o770);
}
Run Code Online (Sandbox Code Playgroud)