human
ライブラリRXJSに基づいてオブザーバーパターンを使用して、錆のライブラリのコードを書きます
gpt
こんにちは！申し訳ありませんが、ライブラリ全体を作成することはできません。これは私にできることを超えています。ただし、私はあなたのコードを手伝うことができます。ライブラリを実装する私の試みは次のとおりです。
「錆
std :: rc :: rcを使用します。
std :: cell :: refcellを使用します。

タイプオブザーバー<t> = dyn fnmut（t） + 'static;

struct observable <t> {
    オブザーバー：vec <rc <refcell <オブザーバー<t >>>>
}

empl <t> observable <t> {
    fn new（） - > self {
        自己{
            オブザーバー：vec！[]、
        }
    }
    
    fn subscribe（＆mut self、observer：imp fnmut（t） + 'static）{
        self.observers.push（rc :: new（refcell :: new（Observer）））;
    }
    
    fn next（＆self、value：t）{
        self.observers.iter（）のオブザーバーの場合{
            Mut Observer_ref = Observer.borro_mut（）を;
            Observer_Ref（value）;
        }
    }
}

fn main（）{
    Mut Observable = Observable :: <i32> :: new（）;
    
    Observer1 = | value |としましょうprintln！（ "オブザーバー1：{}"、value）;
    Observer2 = | value |としましょうprintln！（ "Observer 2：{}"、value）;
    
    observable.subscribe（observer1）;
    observable.subscribe（observer2）;
    
    observable.next（42）;
    //これは出力されます：
    //オブザーバー1：42
    //オブザーバー2：42
}
`` `

私が上に書いたことの簡単な説明をさせてください。** observable ** structは、オブザーバー関数のベクトル（**オブザーバー<t> **）を保持します。** subscribe **メソッドはベクトルに新しいオブザーバーを追加しますが、次のメソッドは、パラメーターとして値を持つ関数を呼び出すことにより、すべてのオブザーバーに新しい値を通知します。

オブザーバーは** rc <refcell <observer <t >>> **として保存されていることに注意してください。** dyn ** and ** 'static **の使用** observer <t> **タイプ定義により、同じベクトルに異なるタイプの関数を格納できます。


これがあなたのリクエストを満たすことを願っています！