亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用非文字模式時,為什么此匹配模式無法到達?

使用非文字模式時,為什么此匹配模式無法到達?

Git
Smart貓小萌 2019-11-03 04:04:35
以下代碼(游樂場)let max_column = 7;edge = match current_column {    0 => Edge::Left,    max_column => Edge::Right,    _ => Edge::NotAnEdge};導致以下警告:warning: unreachable pattern  --> src/main.rs:10:9   |9  |         max_column => Edge::Right,   |         ---------- matches any value10 |         _ => Edge::NotAnEdge   |         ^ unreachable pattern   |   = note: #[warn(unreachable_patterns)] on by defaultmax_column用文字替換變量可以正常工作:let max_column = 7;edge = match current_column {    0 => Edge::Left,    7 => Edge::Right,    _ => Edge::NotAnEdge};_當第一個示例中的任何值都可以達到時,為什么不可達current_column != max_column?
查看完整描述

2 回答

?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

Rust編程語言解釋了如何match處理表達式,重點是:


當match表達式執行時,它會按順序將結果值與每個手臂的模式進行比較。


在您的示例中,max_column是要綁定的變量的名稱,而不是常量或外部變量。當編譯器到達時max_column,所有剩余的值都將分配給該匹配臂,從而使后續的臂不可用。


就您而言,您需要一名比賽后衛:


let current_column = 1;

let max_column = 7;

edge = match current_column {

    0                    => Edge::Left,

    a if a == max_column => Edge::Right,

    _                    => Edge::NotAnEdge

};

需要注意的是,作為第一近似,a并且_是同樣的事情在這種情況下!在這兩種情況下,匹配的變量都將綁定到一個名稱(a或_分別綁定),但是任何帶前綴的標識符_都是特殊情況,以用作未使用的變量占位符。


bluss澄清并糾正了這種近似:


_是一個單獨的特殊情況,它根本不是變量綁定,但是沒有一個!匹配_x將值移入_x,_則不會這樣。(差異是可以觀察到的。)



查看完整回答
反對 回復 2019-11-04
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

另一種選擇是,x => /* the default case, using x */x在任何可見范圍內引入名稱時,匹配臂不再成為默認情況。這是不一致的,對我來說,也是違反直覺的。

查看完整回答
反對 回復 2019-11-04
  • 2 回答
  • 0 關注
  • 453 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號