我需要发送一些消息(作为向量),并且它们需要以相同的长度发送。如果向量的长度不正确,我想用零填充向量。
假设我们需要所有有效负载的长度为 100。我想我可以使用该extend函数并执行如下操作:
let len = 100;
let mut msg = &[1,23,34].to_vec();
let diff : usize = msg.len()-len;
let padding = [0;diff].to_vec();
msg.extend(padding);
Run Code Online (Sandbox Code Playgroud)
但这不会编译,因为编译器抱怨这diff不是一个常量。但对于我们正在尝试做的这个简单的事情来说,这似乎相当冗长。
有没有一种好的、简洁的方法来做到这一点?
我正在为自己做一些整数,我试图完全理解整数溢出。
我一直在阅读有关混合不同大小的整数类型是多么危险的内容。出于这个原因,我想要一个例子,其中短整型的溢出速度比整型快得多。这是片段:
unsigned int longt;
longt = 65530;
unsigned short shortt;
shortt = 65530;
if (longt > (shortt+10)){
printf("it is bigger");
}
Run Code Online (Sandbox Code Playgroud)
但是这里的 if 语句没有被运行,这一定意味着短路没有溢出。因此我得出结论,在表达式中shortt+10发生了从短整型到整数的转换。
这对我来说有点奇怪,当 if 语句计算表达式时,它是否可以随意分配新的整数类型?
然后我想,如果我添加两个短路,那么肯定会评估为短路:
unsigned int longt;
longt = 65530;
unsigned short shortt;
shortt = 65530;
shortt = shortt;
short tmp = 10;
if (longt > (shortt+tmp)){
printf("Ez bigger");
}
Run Code Online (Sandbox Code Playgroud)
但可惜的是,这个比例仍然被评估为错误。
然后我尝试做一些完全明确的事情,我实际上将加法添加到短类型中,这一次迫使它溢出:
unsigned int longt;
longt = 65530;
unsigned short shortt;
shortt = 65530;
shortt = shortt;
short tmp = shortt + 10; …Run Code Online (Sandbox Code Playgroud) 如果我有一个模仿选项类型的枚举,它可以包含一些值,也可以不包含任何值:
enum option {
some(u8),
none,
}
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样进行模式匹配:
let x = option::some(8);
match x {
some => println!("some"),
none => println!("none"),
}
Run Code Online (Sandbox Code Playgroud)
但是如果我想对 some 内的值进行模式匹配怎么办?直觉上,我认为它会是这样的:
match x {
some(x) => println!("{}", x),
none => println!("none"),
}
Run Code Online (Sandbox Code Playgroud)
但 Rust 不知道这是什么。我也尝试看看它some本身是否是u8值:
match x {
some => println!("{}", some),
none => println!("none"),
}
Run Code Online (Sandbox Code Playgroud)
这也是行不通的。如何获取枚举内的值?
我正在尝试学习如何使用结果,并且想要创建一个抛出错误的函数。所以如果我创建这个:
use std::io::{Read, Write,Error};
fn func(n:u8) -> Result<u8, Error> {
if (n == 2){
Error::new(ErrorKind::Other, "oh no!")
} else {
return Ok(n)
}
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为该函数需要一个结果,而不是一个实际的错误。但我认为我能够做到这一点,就像函数返回的错误一样。它给出了这个错误:
note: expected enum `std::result::Result<u8, std::io::Error>`
found struct `std::io::Error`rustc(E0308)
Run Code Online (Sandbox Code Playgroud)
为什么会失败?以及我如何真正返回错误?
我正在使用 Rust 的会话类型,并且我有一个非常简单的函数,可以执行以下操作:
fn srv(c: Chan<(), Server>){
let (c, n) = c.recv();
let tmp = false;
if n % 2 == 0 {
let tmp = true;
} else {
let tmp = false;
}
let c = c.send(tmp);
let (c, s) = c.recv();
println!("server side: {}", s);
c.close();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,rust 编译器认为该tmp变量未被使用。这对我来说似乎很奇怪,因为我将它传递给函数recv。
fn srv(c: Chan<(), Server>){
let (c, n) = c.recv();
let tmp = false;
if n % 2 == 0 {
let tmp = true; …Run Code Online (Sandbox Code Playgroud)