質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Rust

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

Q&A

1回答

698閲覧

【Rust】println!の挙動

lotadcate

総合スコア24

Rust

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

0グッド

0クリップ

投稿2022/12/13 01:21

前提

println! の挙動について質問です. ふと気になってしまったので質問します. なにか勘違いしていたらすみません.

該当のソースコード

rust

1fn main() { 2 let mut s = "Hello".to_string(); 3 println!("s = {}", s); 4 5 s.clear(); 6 println!("s = {}", s); 7}

これの実行結果は

Rust

1s = Hello 2s =

となりますが, これは println!s が勝手に参照として渡されているということなのでしょうか. 私には StringCopy トレイトを実装していないので3行目の println! には値が渡っているように見えています.

以下のようにs.clear() の前が普通の関数なら所有権の移動が起こり, コンパイルエラーになりますが, println! のようなマクロであればそれが起きないのでしょうか.

Rust

1fn print(s: String) { 2 println!("s = {}", s) 3} 4 5fn main() { 6 let mut s = "Hello".to_string(); 7 print(s); 8 9 s.clear(); //ERROR 10 println!("s = {}", s); 11}

エラーメッセージ

Error

1 Compiling playground v0.0.1 (/playground) 2error[E0382]: borrow of moved value: `s` 3 --> src/main.rs:9:5 4 | 56 | let mut s = "Hello".to_string(); 6 | ----- move occurs because `s` has type `String`, which does not implement the `Copy` trait 77 | print(s); 8 | - value moved here 98 | 109 | s.clear(); 11 | ^^^^^^^^^ value borrowed here after move 12 13For more information about this error, try `rustc --explain E0382`.

最後に

ご教示いただけますと幸いです.

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

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

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

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

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

guest

回答1

0

マクロは値も参照も受け取りません。 言語としての解釈が始まる前の字面を変換するのがマクロの役割であり、受け取るのはトークン列です。 この場合の s は変数の値でも参照でもなく s という「名前」です。

マクロはマクロを含まないプログラムに展開されます。 展開された後の形で所有権を移動するか参照をとるか、あるいは何にも使わないのかはマクロの定義次第です。 マクロの実引数として与えたものは必ずしも Rust の通常の式の規則に従わずに個別のマクロのルールで解釈されます。

分かりやすい例として、 println! では

rust

1println!("{value}", value=4);

というような書き方ができますが value=4 というのは変数 value4 を代入しているわけではなく、 println! のルールの中ではこの書き方でラベルを付けて書式のほうではそのラベルの名前で参照できるという独自のルールがあるからこう書けるわけです。

  • マクロに与えた実引数をどう解釈してどう展開するかは個々のマクロ次第。
  • println! の場合は変数の所有権を取っていない。

投稿2022/12/13 05:50

SaitoAtsushi

総合スコア5444

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問