< 返回版块

rdigua 发表于 2023-01-31 20:27

Tags:function

fn buffer_f<const C: usize>(p: &str) -> Result<[u8; C], Box<dyn std::error::Error>>
//<const C: usize, S: AsRef<str>>
//where
  //  S: AsRef<str>,
{
    let mut f = File::open(p)?;

    let mut buffer = [0; C];
    let number = f.read(&mut buffer[..])?;
    Ok(buffer)    
}

fn main(){
let p = "./Cargo.toml";
buffer_f::<20>(p);
}

上面函数buffer_f的第二个参数想加上 S: AsRef 使得&str或者String都可以。 不知道怎么写 如果 fn buffer_f<const C: usize,S: AsRef<str>,>(p: S)-> ...这样 好像S也被设置成const了

评论区

写评论
Pikachu 2023-02-01 00:54

Please read the documentation.

Rust reference: https://doc.rust-lang.org/reference/items/generics.html

--
👇
rdigua

作者 rdigua 2023-01-31 21:52
fn foo<const C: usize>() -> [i32; C] {
    [1; C]
}
Then call it as

foo::<3>();

传 一个const 可以按照上面来

fn f_exist<S>(p: S) -> ....
where
    S: AsRef<str>,

常规的可以这样来

不清楚的是 以上两种都有的 放一起怎么写呢

Pikachu 2023-01-31 21:36

哦大概看明白了你的问题。

首先,这个不叫函数参数,这个写在尖括号<>里面叫泛型参数。写在小括号()里面的才叫函数参数。

然后,在泛型参数中,形如const VALUE: Type的语法是常量泛型,这里const仅修饰Value,表示它是个编译期确定的值。const不会修饰逗号后面的泛型参数。

建议好好看看the book和reference,把rust的语法搞清楚再下手写。

hax10 2023-01-31 21:36

let mut f = File::open(p)?;

替换成

let mut f = File::open(p.as_ref())?;

就能编译通过,buffer_f也就能接受&str、String以及&String类输入,不知道这是不是你想要的效果。

Pikachu 2023-01-31 21:23

不能理解你的问题描述。什么叫“S也被设置成const了”?

另外我建议直接照抄File::open的类型约束。

1 共 5 条评论, 1 页