それはとても錆びた!
私は最近、さびを拾いました、大部分の人々のように、私は誇大宣伝に抵抗できませんでした.それがStackOverflow's most loved languageという理由で一貫している理由があるべきです、そして、なぜ、私は500 +ページindustry's best chance at Safe Systemsを通り抜けることができたでしょう.あなたが言語が好きであるかどうかに関係なく、さびが面白いことを否定することはありません.
さびの定義機能のほとんどは、特に新しい、またはユニークではありません:関数プログラミング、オブジェクト指向プログラミング、メタプログラム、nullの欠如、ガベージコレクタなしのメモリ管理は、錆の前に回避されている多くの中にあります.メモリの安全性と実行時のパフォーマンスのために意図的にオーケストレーションされている方法で錆が目立つ.このシリーズでは、これらの機能のいくつかを強調します.
NULLから始めましょう.NULLは本当に何を意味しますか?ほとんどの言語では、voidを意味します:何も無効、ゼロ、任意の型に置き換えることができるプレースホルダ.それは1965年にトニーホア卿によって発明されて、それ以来人気がありました.RustはNULLをサポートしていない非常に少数のプログラミング言語の間であり、良い理由です.
まず、ホア自身はbookと呼ばれた.C +開発者として、私はどこにでもnullチェックを書くことの痛みを知っていて、ただ一つのチェックを逃している結果によって生きました.バグ、クラッシュ、セキュリティの脆弱性を避けるという考えは非常に魅力的ですね.
NULLの代わりに、Rustはどんな種類の上でも一般的なenumオプションを持ちます.と2つの変形があります.T型のオブジェクトが値を持たない可能性がある場合、Noneである場合は、その型がTの代わりにオプションになります.したがって、定義されていないオブジェクトや参照を使用することはできません.
この単純なC +プログラムを考えてみましょう.
錆への文字通りの翻訳はこのように見えます、しかし、もちろん、それはコンパイルしません.
だから今までの錆の印象は何ですか?より大きな利益のために不便な?単純な構文の違い以上?熱心なコンパイラ以上?上記のすべて?本当です.我々は錆、さびたものの詳細を探るように滞在を調整!
さびの定義機能のほとんどは、特に新しい、またはユニークではありません:関数プログラミング、オブジェクト指向プログラミング、メタプログラム、nullの欠如、ガベージコレクタなしのメモリ管理は、錆の前に回避されている多くの中にあります.メモリの安全性と実行時のパフォーマンスのために意図的にオーケストレーションされている方法で錆が目立つ.このシリーズでは、これらの機能のいくつかを強調します.
NULLから始めましょう.NULLは本当に何を意味しますか?ほとんどの言語では、voidを意味します:何も無効、ゼロ、任意の型に置き換えることができるプレースホルダ.それは1965年にトニーホア卿によって発明されて、それ以来人気がありました.RustはNULLをサポートしていない非常に少数のプログラミング言語の間であり、良い理由です.
まず、ホア自身はbookと呼ばれた.C +開発者として、私はどこにでもnullチェックを書くことの痛みを知っていて、ただ一つのチェックを逃している結果によって生きました.バグ、クラッシュ、セキュリティの脆弱性を避けるという考えは非常に魅力的ですね.
NULLの代わりに、Rustはどんな種類の上でも一般的なenumオプションを持ちます.と2つの変形があります.T型のオブジェクトが値を持たない可能性がある場合、Noneである場合は、その型がTの代わりにオプションになります.したがって、定義されていないオブジェクトや参照を使用することはできません.
この単純なC +プログラムを考えてみましょう.
#include <iostream>
using namespace std;
struct Wrapper {
int value;
void print() {
cout << value << endl;
}
};
int main() {
cout << "Entrance" << endl;
Wrapper *w = nullptr;
w->print();
cout << "Exit" << endl;
}
それはちょうど罰金をコンパイルしますが、致命的にランタイムでクラッシュします.セグメンテーション違反は、NULLポインタを参照するときに起こります.それは短い、簡単なプログラムのためにデバッグするのは簡単だった.複雑さが大きくなるにつれて、ポインターがパスされ、仮定がなされると、このバグがデバッグに日を要するかもしれない生産に滑るようになります.錆への文字通りの翻訳はこのように見えます、しかし、もちろん、それはコンパイルしません.
fn main()
{
println!("Entrance");
let w: Wrapper = None;
w.print();
println!("Exit");
}
struct Wrapper
{
value: i32
}
impl Wrapper
{
fn print(&self)
{
println!("{}", self.value);
}
}
wはラッパー型ではありえません.値を割り当てることができなければ、ラッパーオブジェクトを取得するためにunwrapしなければならないタイプのオプションでなければなりません.つの安全な方法は、それが何らかの値で、それ以外の場合は無視する場合、wを使用する単純なif条件です.以下のバージョンはそれを行い、正しく動作します.fn main()
{
println!("Entrance");
let w: Option<Wrapper> = None;
if let Some(v) = w
{
v.print();
}
println!("Exit");
}
C +は同様に任意の型のオプションを持っていますが、nullのままでは、その利点もよく、オプションです.だから今までの錆の印象は何ですか?より大きな利益のために不便な?単純な構文の違い以上?熱心なコンパイラ以上?上記のすべて?本当です.我々は錆、さびたものの詳細を探るように滞在を調整!
Reference
この問題について(それはとても錆びた!), 我々は、より多くの情報をここで見つけました https://dev.to/imaculate3/that-s-so-rusty-3akmテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol