0

状態を変更するコールバックと一緒に構造体に状態をバンドルしようとしています。マネージ ポインターを使用すると正常に動作します。

struct StateAndCallbacks01 {
  state: @mut int,
  inc: @fn(),
  dec: @fn()
}

let state01: @mut int = @mut 0;
let inc01: @fn() = || {
  *state01 += 1;
};
let dec01: @fn() = || {
  *state01 -= 1;
};
let state_cbs_01 = @StateAndCallbacks01 {
  state: state01,
  inc: inc01,
  dec: dec01
};
(state_cbs_01.inc)();
println(fmt!("state: %d", *state_cbs_01.state));
(state_cbs_01.dec)();
println(fmt!("state: %d", *state_cbs_01.state));

次に、この構造を別のタスクに送信したいので、どこでも一意のポインターに切り替える必要があります。私はそれを機能させることができません:「エラー:廃止された構文:constまたは変更可能な所有ポインター」

struct StateAndCallbacks02 {
  state: ~mut int,
  inc: ~fn(),
  dec: ~fn()
}

let state02: ~mut int = ~mut 0;
let inc02: ~fn() = || {
  *state02 += 1;
};
let dec02: ~fn() = || {
  *state02 -= 1;
};
let state_cbs_02 = ~StateAndCallbacks02 {
  state: state02,
  inc: inc02,
  dec: dec02
};

let (port, chan): (Port<bool>, Chan<bool>) = stream();
do spawn {
  (state_cbs_02.inc)();
  println(fmt!("state: %d", *state_cbs_02.state));
  (state_cbs_02.dec)();
  println(fmt!("state: %d", *state_cbs_02.state));
  chan.send(true);
};
let result = port.recv();
println(fmt!("result: %s", result));

助言がありますか?タスク間でコールバックを送信するより良い方法はありますか?

4

1 に答える 1

3

関数をフィールドとして構造体に保持する代わりに、メソッドを構造体に追加できます。

struct Foo {
    data: int
}

impl Foo {
    fn inc(&mut self) {
        self.data += 1;
    }
}

このimpl構文を使用すると、構造体でメソッドを定義できます。後で呼び出すことができます:

let mut my_foo = Foo { data: 0 };
my_foo.inc();

メソッドは可変参照を取る必要があるため、可変my_fooとして宣言する必要があります。inc

廃止された構文エラーの理由は~mut 0、オブジェクトの「所有者」によって可変性が決定されるため、doing が推奨されないためです。代わりにあなたがしなければならないことはlet mut foo = ~0. 変数fooは「所有者」であるため、可変性を宣言する場所です。@-ポインターは、可変性を継承せず、タスク ローカル GC によって管理されるという点で特別です。( Rust チュートリアルのセクション 8 と 9 は、これをよりよく説明しています)

以上をまとめると、元のコードは次のように記述できます。

struct State {
    data: int 
}

impl State {
    fn inc(&mut self) {
        self.data += 1;
    }   

    fn dec(&mut self) {
        self.data -= 1;
    }   
}

fn main() {

    let state = State {
        data: 0
    };  

    let (port, chan) = stream();

    do spawn {

        let mut state = state;

        state.inc();
        println(fmt!("State: %d", state.data));
        state.dec();
        println(fmt!("State: %d", state.data));

        chan.send(true);
    };  

    let result = port.recv();
    println(fmt!("Result: %?", result));

}
于 2013-05-25T23:35:57.333 に答える