🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

291閲覧

Rust の構造体の挙動

Yhaya

総合スコア439

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2019/11/04 13:50

環境

  • Ubuntu 19.10
  • cargo 1.39.0

質問したいこと

今読んでいる Rust のコードで次のようなコードがありました。

rust

1use structopt::StructOpt; 2 3#[derive(Debug, StructOpt)] 4#[structopt(name="ruplacer")] 5struct Opt { 6 #[structopt(long = "go")] 7 go: bool, 8 9 #[structopt(help = "The pattern to search for")] 10 pattern: String, 11 12 #[structopt(help = "The replacement")] 13 replacement: String, 14 15 #[structopt( 16 parse(from_os_str), 17 help = "The source path. Default to the working directory" 18 )] 19 path: Option<PathBuf>, 20 21 // (省略) 22} 23 24fn main() { 25 let args: Vec<_> = std::env::args().collect(); 26 if args.contains(&"--type-list".to_string()) { 27 on_type_list(); 28 return; 29 } 30 31 let opt = Opt::from_args(); 32 let dry_run = !&opt.go; 33 34 let color_when = &opt.color_when.unwrap_or(ColorWhen::Auto); 35 configure_color(&color_when); 36 37 let path = opt.path; 38 let path = path.unwrap_or_else(|| Path::new(".").to_path_buf()); 39 40 let Opt { // <- ここがわからない 41 pattern, 42 replacement, 43 word_regex, 44 .. 45 } = opt; 46 47 // (省略) 48}

このコードはこちらの GitHub リポジトリmain.rs から引用しています。

このコードの main 関数の中で、let Opt から始まる部分の挙動が理解できません。この式の左辺が右辺に来ており、左辺に指定されている変数に代入するというものはよく見ると思うのですが、 Opt{} が左辺に来ると、optOpt{} に代入されるのでしょうか?

また、let Opt{} の最後に2つのドットがありますが、この挙動もよくわかりません。ドキュメントなどを見ると .. のあとに構造体のインスタンスの名前を指定することでこのインスタンスの持つ変数の値を踏襲できるという使い方は書いてあるのですが、 .. のあとに何も指定しないとどうなるのでしょう?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

パターンマッチです。

rust

1let Opt { 2 pattern, 3 replacement, 4 word_regex, 5 .. 6} = opt;

patternreplacementword_regaxに合致して値を取り出すことができます。
また..によって使わない値を無視することができます。

下記のWebサイトも併せてご覧ください
Pattern Syntax - The Rust Programming Language

(日本語版はこちらにあります)

投稿2019/11/04 14:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yhaya

2019/11/05 10:20

なるほど、これもパターンマッチなんですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問