WithLatestFrom
1. 概要
WithLatestFrom は、メインソース(第 1 の Observable)が新しい値を発行したときに、もう一方の Observable の最新値と組み合わせて結果を生成するオペレーターです。
CombineLatest と異なり、サブソース(第 2 の Observable)が新しい値を発行しても結果は生成されません。メインソースの発行タイミングのみが結果の発行を駆動します。サブソースがまだ値を発行していない場合、メインソースの値は破棄されます。
2. シグネチャ
メインソースの発行時に他方の最新値と結合する
csharp
public static Observable<TResult> WithLatestFrom<TFirst, TSecond, TResult>(
this Observable<TFirst> first,
Observable<TSecond> second,
Func<TFirst, TSecond, TResult> resultSelector)first(メインソース)が値を発行するたびに、second の最新値とともに resultSelector に渡して結果を生成します。second がまだ値を発行していない場合、first の値は無視されます。
csharp
source.WithLatestFrom(latest, (x, y) => x + y)3. マーブルダイアグラム
メインソースが値を発行するたびに、サブソースの最新値と組み合わせた結果が下流へ流れます。サブソースだけが発行しても結果は生成されません。
4. サンプルコード
csharp
using R3;
var main = new Subject<string>();
var sub = new Subject<int>();
main.WithLatestFrom(sub, (str, num) => $"{str}:{num}")
.Subscribe(x => Console.WriteLine(x));
sub.OnNext(1);
main.OnNext("A"); // 出力: A:1
sub.OnNext(2); // 出力なし(サブソースの発行のみ)
sub.OnNext(3); // 出力なし
main.OnNext("B"); // 出力: B:3(サブソースの最新値 3 を使用)
main.OnNext("C"); // 出力: C:35. 補足
CombineLatest との違い
CombineLatest は、いずれかのソースが値を発行するたびに結果を生成します。WithLatestFrom はメインソースの発行タイミングのみで結果を生成するため、サブソースの高頻度な発行に影響されません。
| 特性 | CombineLatest | WithLatestFrom |
|---|---|---|
| 発行トリガー | いずれかのソース | メインソースのみ |
| サブソースの発行で結果生成 | する | しない |
| 典型的な用途 | 双方向バインディング | メインに補助情報を付加 |