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

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

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

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

Q&A

解決済

1回答

373閲覧

【Rust】&i32の値を返す関数で&&i32の値を返そうとしてもエラーにならない

_toku_san

総合スコア5

Rust

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

0グッド

0クリップ

投稿2019/11/16 03:34

質問

以下のコードのfirst_element関数で,&&list[0]という&&i32型の値を返しています.関数は&i32型の値を返すべきであるのに&&i32の値を返しているので,型不一致のエラーにが起こるはずなのにエラーになりません.出力も正しいです.

ソースコード

rust

1fn main() { 2 let list = [1, 2, 3]; 3 4 println!("{}", first_element(&list)); 5} 6 7fn first_element(list: &[i32]) -> &i32 { 8 &&list[0] 9} 10

試したこと

&&list[0]list[0]にするとmismatched typesのエラーが発生.

error[E0308]: mismatched types --> src/main.rs:8:5 | 8 | list[0] | ^^^^^^^ | | | expected &i32, found i32 | help: consider borrowing here: `&list[0]` | = note: expected type `&i32` found type `i32`

なぜか&&list[0]&の数を変えても(&がついている限り)エラーが起きない.すなわち&list[0]&&&list[0]&&&&list[0]ではエラーが起きない.出力も正しい.

補足情報

cargo 1.38.0
rustc 1.38.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらく Deref による挙動だと思われます。つまり、次のコードで &String&str に変換されるのと同様です。

rust

1fn type_name_of<T>(_: T) -> &'static str { 2 // この関数はデバッグ目的でのみ利用すること。 3 // 型名を出力するが、出力の形式についての保証はない。 4 std::any::type_name::<T>() 5} 6 7fn main() { 8 let string = "hello".to_string(); 9 let ref_string = &string; 10 let ref_str: &str = ref_string; 11 12 println!("{}", type_name_of(ref_string)); 13 // => "&alloc::string::String" (一例) 14 15 println!("{}", type_name_of(ref_str)); 16 // => "&str" (一例) 17 18 println!("{}", type_name_of(string)); 19 // => "alloc::string::String" (一例) 20}

というのも、標準ライブラリ内に次のような Deref の実装があるからです。

rust

1impl<T: ?Sized> Deref for &T { 2 type Target = T; 3 fn deref(&self) -> &T { *self } 4}

これによって &&T&T へ Deref されます。 (うまくいかないこともありますが) この変換は推移的に行われるので、いくつ & をつけても &&&&T -> &&&T -> &&T -> &T へ変換されます。

投稿2019/11/16 04:19

Eki

総合スコア429

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問