これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.
DatagramBuilder
DatagramBuilder は送信するコマンドを積み上げ, Frames へ変換する構造体.
Client::datagram_builder で得る.
push でコマンドを積み, build で Frames に変換する.
得られた Frames は複数の Frame に分割し, Client::send / send_checked で 1 フレームずつ送信する.
let mut builder = client.datagram_builder();builder.push(SetSilencer::default());let frames = builder.build()?;for frame in &frames { client.send_checked(frame).await?;}builder = client.datagram_builder()builder.push(SetSilencer())frames = builder.build()for frame in frames: await client.send_checked(frame)var builder = client.DatagramBuilder();builder.Push(new SetSilencer());var frames = builder.Build();foreach (var frame in frames){ await client.SendCheckedAsync(frame);}| メソッド | 説明 |
|---|---|
push(cmd) |
全デバイス共通のコマンドを積む |
push_each(assign) |
デバイスごとに異なるコマンドを積む (下記参照) |
build() |
積んだコマンドを Frames に変換する |
push_each
Section titled “push_each”push_each はデバイスを引数にするクロージャを受け取り, デバイスごとに異なるコマンドを割り当てる.
Rust では FnMut(&Device) -> Option<C>, Python では Callable[[Device], Command | None], C# では Func<Device, ICommand?>.
None を返したデバイスには, そのステップで何も割り当てない.
let mut builder = client.datagram_builder();builder.push_each(|device| { Some(if device.idx() % 2 == 0 { Pattern::new(&left) } else { Pattern::new(&right) })});let frames = builder.build()?;builder = client.datagram_builder()builder.push_each(lambda device: Pattern(left if device.idx() % 2 == 0 else right))frames = builder.build()var builder = client.DatagramBuilder();builder.PushEach(device => device.Idx % 2 == 0 ? new Pattern(left) : new Pattern(right));var frames = builder.Build();Rust ではクロージャの返り値はすべて同じ型でなければならない.
型の異なるコマンドを混在させたい場合は, Command::boxed で BoxedCommand に揃えるか, push_eachを型ごとに呼ぶ.
Python は動的型付けのため, デバイスごとに異なる型のコマンドをそのまま返せる.
let mut builder = client.datagram_builder();builder.push_each(|device| { Some(if device.idx() % 2 == 0 { Pattern::new(&left).boxed() } else { Modulation::new(SamplingConfig::FREQ_4K, &modulation).boxed() })});let frames = builder.build()?;