2017-03-08 4 views
-1

私は所有システムを理解しようとしています。 ::機能、可変借用

error: expected `::`, found `=` 
--> src/main.rs:8:16 
    | 
8 | let i: <i32> = test(&mut vec); 
    |    ^

error: type `()` cannot be dereferenced 
--> src/main.rs:2:5 
    | 
2 |  *v1.push(10);  
    |  ^^^^^^^^^^^^ 

=を変更する:私はこれらの2つのエラーを取得し

fn test(v1: &mut Vec<i32>) -> i32 {  
    *v1.push(10);  
    v1[3] 
} 

fn main() { 
    let mut vec: Vec<i32> = vec![10, 20, 30]; 
    let i: <i32> = test(&mut vec); 
} 

:それをテストするために、私はVecを借り機能を作りたかった、それに値を追加し、その値を返します。助けにならないと私はなぜそれがどうなるか理解していない。

答えて

0

すべてのタイプを<>で囲むべきではありません。 <>は、汎用パラメータを指定することを意味します。これで十分です:

let i: i32 = /* value */; 

さらに型を指定する必要はありません。コンパイラは型を推論します。

let mut vec = vec![10, 20, 30]; 

let i = test(&mut vec); 

これは、2番目の問題を解決するはずです。

()を逆参照しようとしているため、最初のエラーが発生します。これはまったく参考になりません。 C(およびC++)で

我々は2つの異なるアクセス演算子を持っている:

  • .あなたが構造体フィールド(およびC++のメソッド)にアクセスすることができます
  • ->あなたは構造体のフィールドにアクセスすることを可能にしますポインタの後ろ

錆はこれらの詳細をあなたから隠すので、.オペレータを使用する必要があります。

Vec::<T>::push(&mut vec, val: T)のタイプは、()(ユニットタイプ)を返すことを意味します。問題を解決するには、*を削除してください。

fn test(v1: &mut Vec<i32>) -> i32 { 
    v1.push(10); 

    v1[3] 
} 

fn main() { 
    let mut vec = vec![10, 20, 30]; 
    let i = test(&mut vec); 
} 
+0

回答ありがとうございます。それは今働く。私は参照の内容にアクセスするために*が必要であると思った。 –

+1

最初に間接参照する必要はありませんが、ブラケットを使用するだけで '(* v1).push(10)'と '*(v1.push(10))ではなく'として解析されます。これはCと同じ演算子の優先順位です。 – trentcl

関連する問題