小编uru*_*ubi的帖子

`where`关键字的语法和语义是什么?

不幸的是,Rust的文档where非常缺乏.关键字仅出现在参考中的一个或两个不相关的示例中.

  1. 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)
  2. 在CharEq特性的实现中,它似乎where被用作某种"选择器"来为匹配某种闭包类型的任何东西实现Trait.我对么?

有什么方法可以让我得到更好,更完整的图片where吗?(完整的使用和语法规范)

rust

20
推荐指数
1
解决办法
4691
查看次数

往返于可变借入的结构

有人可以解释为什么将值移到借来的结构中是有效的,而不是将它们移出去?例如:

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

6
推荐指数
1
解决办法
298
查看次数

如何将Vec <T>转换为C-friendly*mut T?

我有一个Rust库,它u8通过FFI 将数组返回给C调用者.该库还在客户端完成后处理数组.该库没有状态,因此客户端需要拥有该数组,直到它被传递回库以供释放.

使用box::from_raw并且boxed::into_raw会很好,但我无法解决如何将数组转换为返回类型的问题.

ffi rust

5
推荐指数
1
解决办法
911
查看次数

在宏中处理与类型相关的警告的最佳策略是什么?

我已经定义了一个宏来优雅地处理越界切片.以下是宏的定义:

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到临时变量?明确地投射它?

rust

2
推荐指数
1
解决办法
325
查看次数

我可以确定泛型类型的零值吗?

我设法找到的最接近的是std::num::Intstd::num::Float 定义的特征zero().但是,它们特定于原始类型.

rust

1
推荐指数
1
解决办法
814
查看次数

如何使用set_mode将权限应用于文件?

如果我的理解是正确的,则以下代码应生成一个可执行文件。但是事实并非如此。它已创建,但未应用指定的权限。我究竟做错了什么?

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)

rust

1
推荐指数
2
解决办法
845
查看次数

标签 统计

rust ×6

ffi ×1