Replies: 44 comments 45 replies
这里表达错误了,第二个分支指定匹配 x 为 0 的 Point,而不是匹配y不为0,x为0的Point,可以匹配y为0的Point,建议更改一下。 |
x=0,y=0 会匹配第一个分支,匹配不到第二个 |
|
@绑定可能是所有模式匹配中最难记忆的一个。 我现在这样助记: @ 符号右侧的 |
能问一下吗,在match中第一个分支中x匹配了some(s)此时x的所有权转移到了s中了吗?如果转移到了s上那么因为匹配守卫的关系,这一分支就不匹配了,这时应该匹配第二还是第三个分支。 |
是不支持吗???? error[E0658]: pattern bindings after an |
这里是不是说的逻辑有问题? x不可能同时为Some(5)和None吧 |
|
属性条件与属性变量 复杂类型 | 基本类型 数据的绑定 任何一个匹配都可以写成这种形式: |
|
很灵活,很强大 |
|
let arr: &[u16] = &[114, 514]; if let [x, ..] = arr { if let &[.., y] = arr { 这么臭的数组有匹配的必要吗(半恼) |
|
if let 好像没有守卫匹配的语法 |
|
懵了😂 |
|
let arr: [u16; 2] = [114, 514]; 哈哈 |
|
enum Message { let msg = Message::Hello { id: 5 }; match msg { fn main() { |
enum Message {
Hello { id: i32 },
}
let msg = Message::Hello { id: 5 };
match msg {
Message::Hello { id: id_variable @ 3..=7 } => {
println!("Found an id in range: {}", id_variable)
},
Message::Hello { id: 10..=12 } => {
println!("Found an id in another range")
},
Message::Hello { id } => {
println!("Found some other id: {}", id)
},
}
上面这个跟我下面这个用守卫模式有啥区别吗?
enum Message {
Hello {id:i32},
}
fn main() {
let msg = Message::Hello { id: 5 };
match msg {
Message::Hello {id} if id>2 => {
print!("{}\n", id)
},
_ => {
println!("Nothing")
}
}
} |
|
太复杂了吧.......... |
|
解构结构体和元组那里的例子容易误会,且不好理解,建议改成这样: |
fn main() {
let x = Some(5);
let y = 10;
match x {
Some(50) => println!("Got 50"),
Some(y) => println!("Matched, y = {:?}", y),
_ => println!("Default case, x = {:?}", x),
}
println!("at the end: x = {:?}, y = {:?}", x, y);
}这段代码中 但是如果我希望打印出 |
|
fn main() { } "如果 x 的值是 None 而不是 Some(5),头两个分支的模式不会匹配,所以会匹配模式 _。这个分支的模式中没有引入变量 x,所以此时表达式中的 x 会是外部没有被遮蔽的 x,也就是 None" 这句话怎么理解? 之前提到了y是新的变量,会匹配x的所有值,为何不是打印println!("Matched, y = {:?}", y)? 是不是因为None为Option中的一个特殊值? |
let arr: &[u16] = &[114, 514];
if let [x, ..] = arr {
assert_eq!(x, &114);
}这里已知 arr 是一个 |
|
最后@绑定那里 是不是也可以用 达到同样的目的,只不过啰嗦一点。 |
|
严格一点,RGB 的定义就是 3 x 8 ,定义成 i32 是否合适 |
|
这已经是我两年内第五次学习Rust了,都是从头重新学的2333。上班族太苦逼了 |
|
那我是不是可以 let y @ 5来进行变量绑定? |
|
可惜牛客的rust才到1.44 |
输出: 导致最后打印的原因是:x was not 10 :(Point { x: 10, y: 23 })
|
|
特性太多了,记不住那么多 |
|
已经不知道几遍了。 再看到等未来需要时 再回来看看 ~_~ |
|
感觉到难度了,@绑定理解不了 |
|
书中的原话: 字符和数字值是 Rust 中仅有的可以用于判断是否为空的类型。 更准确的表达应该是: 字符类型和数值类型是 Rust 中仅有能够形成编译器可验证的连续区间(range)的类型,因此编译器可以在编译期判断该区间是否为空,所以它们也是唯一允许用于 match 范围模式(range pattern)的类型。 |
|
let arr: &[u16] = &[114, 514]; if let [x, ..] = arr { if let &[.., y] = arr { let arr: &[u16] = &[]; assert!(matches!(arr, [..])); |

Uh oh!
There was an error while loading. Please reload this page.
https://course.rs/basic/match-pattern/all-patterns.html
All reactions