Hacker Files は、過去に長すぎなくなったことを知っているはずです。 、Rust が長文であるということをもはや仲介しないのは面倒です: Linux カーネル 内および 内で傾いています。 Android OS、AWS による重要なインフラストラクチャ、および ChromeOS および Firefox。 繰り返しますが、Rust と同じくらい便利です。UI を構築するための完全な言語として、まだ望まれていません。 2019 年、「GUI」は 6 番目に要求の多かった機能 になり、Rust の採用に対抗するようになりました。 Rust には基本的にここに制限があります。言語自体の発明により、UI を構築するためのモデリングのトータル アプローチが洗練されたものになります。
ワープではカスタムUIフレームワークを構築してきました。 1
Rust では、GPU でのレンダリングに使用します。 このフレームワークの構築は非常に洗練されており、多額の資金を調達しましたが、豊富な UI パーツを備えた世界中の他の端末と同じくらい急いでいます。 このレベルの効率性は、UI ライブラリを Electron や Flutter に変更した場合には、ほとんど達成できなかったでしょう。
この記事では、なぜ Rust の通常のメモリ管理モデルと継承の欠如が以前の戦術を洗練されたUIフレームワークを開発し、私たちが取り組んできた最も多くの方法でそれを球体化しました。 私はこれらのアプローチの 1 つ、またはそれらのいくつかの組み合わせを仲介し、すべての人が使用できる過度に効率的な UI レンダリングのための適切な腐ったプラットフォームの UI ツールキットにつながります.
さびが珍しい理由は何ですか?
Rustは、という理論でメモリ管理を行っていますコンパイル時に強制される「所有権」。 これは、
ガベージ コレクター を使用して自動メモリ管理を提供する他の言語とは異なります。
錆の所有権は、次のルールを課すことによって機能します:
fn まず () {させてmut original_owner=構造!(「ハイ・ゼア・ワールド」); させて new_owner=original_owner; println! ( “{}”, original_owner) } エラー : 移動価格の借用: `original_owner`
インスタンスの取得上記のように、Rust コンパイラは、特定の時点で特定の価格の単一の所有者が最も効率的であることを強制します。 さびは、
new_owner の割り当てを妨げます から の価格) original_owner 、コストの住宅所有者が同時に 2 人いる可能性があるためです。
Rust は、価格が変更可能に参照される可能性がある場合のルールによって、アセンブル時のファイル競合に対しても保護します。そして不変。 並行して、これらのルールは、2 つのスレッドが同時に同じ価格を更新することによって引き起こされるファイル競合がないように強制的に構築されます:
いつでも、1 つの可変参照または任意の量の不変参照のいずれかを吸収することさえあるかもしれません。
さびはおそらくおそらく今ではありませんオブジェクト指向言語は、Java、C++、または Javascript に似ていますが、クラスの継承や抽象クラスを強化するものではありません。 これは意図的な発明の決定になりました: Rust は のために設計されています) 継承より合成
ありがたいことに、ポリモーフィズムを作ることは間違いなく無言ですRust で
UIライブラリを開発する2
多彩なUIが魅力物質(
ボタンに似ています) ,
肖像画 )) をビデオ ディスプレイに表示します。 以前の OOP 言語では、不適切な
Rustでは、トレイトとトレイトオブジェクトを利用することで、1つのことをほとんど単純にすることができます.
ブループリントと呼ばれる合計特性をライブラリに追加できます:
パブ設計図 { fn 青写真 (&自己); }trait
UIフレームワークのパーツはすべてこれを強制します材料の内容をビデオディスプレイに描画するための非常に吸収的なロジックを特徴とし、正当化します。
すべての物質をビデオ ディスプレイに表示するには、合計を参照するだけでよいようにしています。成分の種類にとらわれない抽象的なデザインの物質.
Rustでは、これを採用する特性オブジェクトの (
Box
pub
struct
マスク画面
{ パブ
物質: Vec<
箱>, }
ここでの主な部分は、ギアの記録を形式のベクトルとして参照できることです 箱
impl マスク画面 {
pub
fnmosey
(& 自己) { ために 材料 の 自己 .substances.iter() { 成分.blueprint(); } } }
このデザインは、作成するのに十分な解像度として機能します継承のないポリモーフィズム。 繰り返しになりますが、OOP または継承のすべての部分を一般的に提供するわけではありません。不適切なクラスのフィールドまたはアイデアを参照し続けながら、完全なクラスを正当化してその機能を拡張することはできません。
特性は正確に全機能 (関数の記録) の配置を正当化しますが、すべての実装で概説されている情報のいずれも指定しません特性。 この場合、ブループリント UI 構成要素で発明するものがないランダムなオブジェクトの特性。 例として、おそらくおそらく、教育的な UI 要素ではないことは間違いない、この Foo という名前のランダムな構造体にもそれを強制することができます:
)構造体
フー); impl 設計図 用 フー {
fn 青写真 (& 自己) {} }
便利な注目すべきすべてのUIは、おそらくツリーとしてモデル化される可能性があります–またはグラフとしてさらに抽象的に。 ツリーは、UI をモデル化するための自然なソリューションです。これにより、さまざまな物質をまとめて発明し、視覚的に洗練された 1 つのものを開発することが簡単になります。 また、少なくとも HTML が存在するようになって以来、UI プログラミングをモデル化するための最も総合的な方法の 1 つでもありました
Rust の UI は洗練されています。これは、継承なしでこの構成要素ツリーを使用するすべての設計のファイルをフラグメント化するのが面倒なためです。 さらに、慣習的な UI フレームワークには、構成要素ツリーを変更する必要がある場所のすべての形式がありますが、Rust の可変性ルールに起因する、この「必要になるにもかかわらずツリーを変更する」設計は機能しません。
ほとんどの UI フレームワークでは、成分ツリーの定理がフレームワークに組み込まれています。 フレームワークはインスピレーション要素を保持し、すべての要素は、すべての子供たちの歌と子供たちを横断する方法を保持する完全に不適切な要素から継承します。 ツリーをトラバースすることは、トーナメントの処理にとって重要です。フレームワークは、ツリーをたどって、どの成分がトーナメントを受け取る必要があるかを決定する必要があるようにする必要があります。 ここでの例は、DOM API 内でのトーナメント バブリングとキャプチャです。トーナメント バブリング (デフォルト) を使用すると、ツリー内の最も深い要素によってイベントが処理され、その後、お父さんまたはお母さんの部分まで「バブル」されます。
これをスマートに行うフレームワークが Flutter です。
ウィジェット 抽象クラス–および から拡張されるさらなる抽象クラス*)Widget put a widget に子がない場合(`LeafRenderObjectElement`)、1 つの子 (` SingleChildRenderObjectElement`) とヒープ キッズ (` MultiChildRenderObjectElement`)。 これらの継承のさらなる層は、すべてスーパークラスによって処理されるため、葉の物質が構成要素ツリーをたどる論理球体と競合する必要がないことを特徴としています。
のタスクの 1 つ、タイマーを使用しましょう7GUI
、私たちは、この木の否定がおそらく貴重である可能性があると主張しています。 私たちのタイマーは、経過時間を表示する開発バー、期間を変更するスライダー、およびタイマーをリセットするボタンを吸収できます.
私たちはこの木を空想的にモデル化することができます:
このツリーの設計は、Rust に対してきれいにスキーム化されていません。 OOPの不足により、おそらく吸収できる成分を発明することが非常に困難になります n 上記の否定の範囲内の子供の空想の量。 上記の特性の例を使用すると、特性にさらに特性を含めるほど複雑ではなくなりました:
特性はファイルを防御しないため、これにはすべての材料を個人的に保護する必要があります小売業者の子供たち。
ここでの Rust の制約である球状の可変性は、茂みをモデル化するのを面倒にします。ツリーを突然変異させなければならないようにしようとします(ナレーションの物質自体を突然変異させるのと同じくらいスマートに物質を追加して削除する必要があるため、これは必須です)。 単一の価格へのいくつかの変更可能な参照を防止する Rust のルールは、共有された変更可能な伝達の使用を思いとどまらせます。ただし、これはツリーでほとんど必須であり、ツリーがノードを所有して変更しますが、他のアプリ ロジックもノード内のすべてのノードを変更する必要があります。 tree.
共有可変コンベアを扱うことは、おそらく状況を処理するときの努力かもしれません。 ほとんどの UI フレームワークは、入力をポーリングするトーナメント ループを利用して、ユーザー インタラクションと競合します。 このフレームワークは、トーナメントの受信時にいつでも任意の数のギアを変更できます.
シェアリングを回避する方法がありますRust ではミュータブルな伝達が行われますが、これらの評価の一部を実行時まで延期する非人間工学的なコードが生成されます。
Aここでの完全な解決策は、を使用することです内部可変の採用
RefCell Rust 慣習ライブラリ内に装備されているフォーム。RefCell は、明るい Rust 所有権評価によって、アセンブル時間の実行時に動作します。 オブジェクトへの変更可能な参照を web するには、おそらくおそらくまた呼び出すことができます borrow_mut:
もしも
𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺
もしも