錆はバスやODCは何の関係も通勤時に基本的に断続的な学校である、または、学ぶために二週間でした。錆は今、の要約をする時間である第一5章をプログラミング言語を学習しています。このデータタイプについてや、私が内容を一覧表示しません、他の場合、私は興味を持ってくれ、その部分について話しています。
- 変数と変動(変数&可変性)
- 暗黙の関数の戻り値
- ステートメント(声明)と式(式)の違いを理解します
- 変数をもたらすことができる破ります
- タプル
- オーナーシップ(所有権)
私が何かを言うその所有権に焦点を当てます。
私は1. 2.みんな信頼性の高い効率的な、キーワードの下で抽出しました。「誰もが」機械指向のアセンブラやCのような言語を説明していない、あなたは現代語、ジェネリック医薬品、反射、サウンドライブラリ、使いやすいなどのコレクションの特徴のいくつかを持っている必要があります。手順は以下になります書かれている信頼性の高い効率的な、「信頼性」の脆弱性は、Cのようなクロスボーダーをチェックしない添字として、それは(無料またはダングリングポインタdouleなど)の一般的なメモリエラーの一部を生成するものではありません。それは私がC ++考える「ハイ」になると、誰もが、長い時間のC ++コンパイラおよび開発は、それが効果的であることから、私だけではなく、したい、(C ++、私は右ではないと言うことは何も持っていない、紳士、ご了承ください)非常に遅いことを言います時間は今速く実行されている、開発時間が速くなければなりません。次に、我々は、私は上記の点言っ探ります。
1.変数の変動と
さび変数のデフォルト次の代入のようなものが違法であると言うことですつまり、不変です。
{主FN() てみましょう = 100 ;= 101 。 }
このエラーは、「二度変数不変の割り当てを与えることはできません。」、発生します
あなたは、変数「となり」を必要とする場合は、変数のmutキーワードで(明示的に)明示的に宣言する必要があります。そのようなA設計のための理由書に、なぜ我々は、変数を表示する必要がない変数でありますか?私は知らない、私は所有権をどうすると思いますか?
{主FN() MUTましょう = 100 ;= 101 。 }
2.陰関数の戻り値
関数が文を返すNAを返した場合、暗黙の機能は、最後の式を返します。もちろん、このようなアプローチはオプションで、あなたはreturn文の伝統的なリターンのバージョンを選択することができます。
FN add_one(NUM:I32) - > I32 {+ 1 } {主FN() MUTましょう = 100 ;= 101 。 println(!" {} " 、add_one())。 }
差の文(ステートメント)を理解し、表現(表現)の3。
さびより厳しい声明を区別するための文および式は、命令がいくつかの操作を実行しますが、結果を生成しない、といくつかの式の評価値を生成しています。
NUM = MUTレット100 ; // 代入 NUM = NUM + 1。 ; // ステートメント NUM + 1つの。 // 表現
関数呼び出しは式です。マクロの呼び出しが式です。私たちは、新しいスコープ(ブロック)を作成するために使用される、ブレース{}
それがあるにも
せY = { Xましょう = 3 ; X + 1 }。
4.ブレーク変数を取ることができます
下側のように、錆の循環ループは、同様の一方(1)です。
{主FN() 聞かせてMUTカウンタ = 0 ; 結果せ = ループ{ カウンタ + = 1 ; もしカウンタ== 10 { ブレークカウンタ* 2 。 } }。 println(!" 結果は{ある} " 、結果)。 }
5.タプル
タプル(タプル)は、多くの異なる種類を含むことができ、化合物の種類です。フォームのこのタイプは、 "(TYPE1、TYPE2、TYPE3 ...)" です。
(tuple1 =せ1、" こんにちは"、3.14 )。 聞かせてtuple2:(I32、文字列、F32)=(1、" こんにちは"、3.14);
だから、どのようにタプルを取得します。解体(非構造)タプルによって、タプルを解体することによって、我々はタプル他の変数に値を割り当てることができます。
(X、Y、Z)= tuple1ましょう。
あなたはまた、直接タプル要素にアクセスするには、ドットを(「」)を使用することができます
X = tuple1をしましょう。0 ; yが聞かせて tuple1を=。1 ; 年 = tuple1。2 ;
6.オーナーシップ(所有権)
所有権は、錆のメモリ管理の中核であり、特徴的なさびの一つです。各値は(理解を小片のメモリである)所有者が、所有者は可変とすることができます。プログラムの所有者がスコープ外になると同時に、所有者を呼び出すことによって、すべての値が(解放される)機能を、ドロップします。(注滴がランタイムによって呼び出されていないが、コンパイルドロップ機能で挿入されていること)、このアプローチはC ++ RAIIメカニズムと同様です。それは注目に値する、所有権が移転することができ、所有価値の移転後の所有者は、彼は変数(所有者)、再びエラーを生成を使用し、不正な錆の所有者とみなされます。
FN FOO(str_cp:String)を{ println(!" {} " 、str_cp)。 } {主FN() STR1ましょう =文字列:: から(" こんにちは世界" ); FOO(0009)。 println(!" {} " 、0009)。 }
上記の例では、ヒープの文字列の「Hello World」を作成し、文字列の所有者は、そのための変数str1は、価値が所有権の形の関数としての変数は、パラメータ値を転送することは注目されており、私たちは関数が返る7行を呼び出すとき、str1がすでに無効所有者である、無駄に貧しいSTR1は、自分のサイトを失ったが、彼は何も収穫はありませんが、そのような所有権の移転、そしてそれは良いです。
这里我生搬硬套了一种情况,尝试说明这种所有权转移的机制是如何防止double free的情况产生的。下面是一段和上述代码段类似的代码段,可以看到这里对同一内存块进行了两次free。那么rust是如何防止这种情况产生的呢?实际上在rust中17行的情况根本就不会出现,因为str1在此时已经是无效的了,没有free它的可能性。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> void foo(char *str) { printf("%s\n", str); free(str); } int main(void) { while (1) { char *str1 = (char *)malloc(512); strncpy(str1, "hello world", 512); foo(str1); free(str1); //double free printf("%s\n", str); } return 0; }
就这样,本文只是我对前几天的学习进行的一个简单的总结。很多重要的东西都没有覆盖,等我的rust用的更熟练,我会尝试出一个Rust教程。Peace。
参考