これは、主にCの様々な型の定義を提供するものです。追加する必要があるでしょう。他言語関数の呼出し次のコードは、snappyがインストールされていればコンパイルできる他言語関数を呼び出す最小の例です。ABIによるもののリストです。アトリビュートは、シンボルが解決できるように、リンカに対してsnappyのライブラリをリンクするよう指示するために使われています。囲まなければなりません。Cライブラリは、スレッドセーフでないインターフェイスを公開していることがありますし、ポインタを引数に取る関数のほとんどは、ポインタがダングリングポインタになる可能性を有しているので、すべての入力に対して有効なわけではありません。生ポインタはRustの安全なメモリモデルから外れてしまいます。他言語関数について引数の型を宣言するとき、Rustのコンパイラはその宣言が正しいかどうかを確認することができません。それを正しく指定することは実行時にバインディングを正しく動作させるために必要なことです。ブロックはsnappyのAPI全体をカバーするように拡張することができます。APIは、メモリの安全性を提供し、ベクタのようなもっと高レベルの概念を使うようにラップしなければなりません。ライブラリは安全で高レベルなインターフェイスのみを公開するように選択し、アンセーフな内部の詳細を隠すことができます。モジュールを使います。Rustのベクタは隣接したメモリのブロックであることが保証されています。その長さは現在含んでいる要素の数で、容量は割り当てられたメモリの要素の合計のサイズです。長さは、容量以下です。外すことによって、その呼出しがすべての入力に対して安全であることが保証されています。関数はもっと複雑です。関数は、圧縮後の結果を保持するために必要な最大の容量のベクタを割り当てるために使うことができます。そのベクタは結果を受け取るための引数としてsnappy_compress関数に渡されます。結果を受け取るための引数は、長さをセットするために、圧縮後の本当の長さを取得するためにも渡されます。必要となるバッファの正確なサイズを取得するため、展開も同様です。しても置いておきます。デストラクタ他言語ライブラリはリソースの所有権を呼出先のコードに手渡してしまうことがあります。いうことが起きる場合には、安全性を提供し、それらのリソースが解放されることを保証するために、Rustのデストラクタを使わなければなりません(特にパニックした場合)。デストラクタについて詳しくは、Dropトレイトを見てください。CのコードからRustの関数へのコールバック外部のライブラリの中には、現在の状況や中間的なデータを呼出元に報告するためにコールバックを使わなければならないものがあります。Rustで定義された関数を外部のライブラリに渡すことは可能です。してマークしておくことです。登録呼出しを通じてコールバック関数をCのライブラリに送ることができるようになり、後でそれらから呼び出すことができるようになります。基本的な例は次のとおりです。これがRustのコードです。}}これがCのコードです。コールバックしています。Rustのオブジェクトを対象にしたコールバック先程の例では、グローバルな関数をCのコードから呼ぶための方法を示してきました。特別なRustのオブジェクトをコールバックの対象にしたいことがあります。これは、そのオブジェクトをそれぞれCのオブジェクトのラッパとして表現することで可能になります。これは、そのオブジェクトへの生ポインタをCライブラリに渡すことで実現できます。CのライブラリはRustのオブジェクトへのポインタをその通知の中に含むことができるようになります。これにより、そのコールバックは参照されるRustのオブジェクトにアンセーフな形でアクセスできるようになります。これがRustのコードです。}}これがCのコードです。7)を呼び出す}非同期コールバック先程の例では、コールバックは外部のCライブラリへの関数呼出しに対する直接の反応として呼びだされました。実行中のスレッドの制御はコールバックの実行のためにRustからCへ、そしてRustへと切り替わりますが、最後には、コールバックはコールバックを引き起こした関数を呼び出したものと同じスレッドで実行されます。外部のライブラリが独自のスレッドを生成し、そこからコールバックを呼び出すときには、事態はもっと複雑になります。そのような場合、コールバックの中のRustのデータ構造へのアクセスは特にアンセーフであり、適切な同期メカニズムを使わなければなりません。中の)チャネルを使うという手もあります。非同期のコールバックがRustのアドレス空間の中の特別なオブジェクトを対象としていれば、それぞれのRustのオブジェクトが破壊された後、Cのライブラリからそれ以上コールバックが実行されないようにすることが絶対に必要です。これは、オブジェクトのデストラクタでコールバックの登録を解除し、登録解除後にコールバックが実行されないようにライブラリを設計することで実現できます。アトリビュートは、rustcに対してネイティブライブラリをどのようにリンクするかを指示するための基本的な構成ブロックです。今のところ、2つの形式のlinkアトリビュートが認められています。コンパイラがリンクするネイティブライブラリの種類です。3つのネイティブライブラリの種類が知られています。"framework")]フレームワークはOSXターゲットでのみ利用可能であることに注意しましょう。値はリンク時のネイティブライブラリの使われ方の違いを意味します。リンクの視点からすると、Rustコンパイラは2種類の生成物を作ります。部分生成物(rlib/staticlib)と最終生成物(dylib/binary)です。ネイティブダイナミックライブラリとフレームワークの依存関係は最終生成物を作るときまで伝播され解決されますが、スタティックライブラリの依存関係は全く伝えません。スタティックライブラリはその後に続く生成物に直接統合されてしまうからです。このモデルをどのように使うことができるのかという例は次のとおりです。ネイティブビルドの依存関係。ときどき、Rustのコードを書くときにC/C++のグルーが必要になりますが、ライブラリの形式でのC/C++のコードの配布は重荷でしかありません。よって依存関係を宣言します。クレートの成果物の種類にかかわらず、ネイティブスタティックライブラリは成果物に含まれます。これは、ネイティブスタティックライブラリの配布は不要だということを意味します。通常のダイナミックな依存関係。ような)一般的なシステムライブラリは多くのシステムで利用可能となっていますが、それらのライブラリのスタティックなコピーは見付からないことがしばしばあります。この依存関係をRustのクレートに含めるときには、(rlibのような)部分生成物のターゲットはライブラリをリンクしませんが、(binaryのような)最終生成物にrlibを含めるときには、ネイティブライブラリはリンクされます。OSXでは、フレームワークはダイナミックライブラリと同じ意味で振る舞います。アンセーフブロック生ポインタの参照外しやアンセーフであるとマークされた関数の呼出しなど、いくつかの作業はアンセーフブロックの中でのみ許されます。アンセーフブロックはアンセーフ性を隔離し、コンパイラに対してアンセーフ性がブロックの外に漏れ出さないことを約束します。アンセーフな関数はそれを全世界に向けて広告します。アンセーフな関数はこのように書きます。関数からのみ呼び出すことができます。他言語のグローバル変数へのアクセス他言語APIはしばしばグローバルな状態を追跡するようなことをするためのグローバル変数をエクスポートします。キーワードを付けて宣言します。i32);}あるいは、他言語インターフェイスが提供するグローバルな状態を変更しなければならないこともあるかもしれません。付きで宣言することができます。付いた作用は全て、読込みと書込みの双方についてアンセーフであることに注意しましょう。ABIをエクスポートしていて、Rustは他言語関数の呼出しのときのデフォルトとしてそのプラットフォーム上のCの呼出規則を使います。APIですが、他の呼出規則を使うものもあります。Rustにはコンパイラに対してどの規則を使うかを教える方法があります。ブロック全体に適用されます。サポートされているABIの規則は次のとおりです。ABIは少し変わっています。この規則はターゲットのライブラリを相互利用するために適切なABIを選択します。