【发布时间】:2017-05-17 14:52:16
【问题描述】:
我有一个简单的 Akka Streams 测试代码(用 F# 编写,但 Scala 版本不匹配):
var source = Source.From(Enumerable.Range(1, 3));
var flow = Flow.FromFunction(new Func<int, string>(x => (x * 2).ToString()));
var sink = Sink.ForEach<string>(output.Add);
var runnable = source.Via(flow).To(sink);
由于 Via 辅助方法只是 ViaMaterialized(flow, Keep.Left) 的快捷方式,我可以这样重写代码:
var source = Source.From(Enumerable.Range(1, 3));
var flow = Flow.FromFunction(new Func<int, string>(x => (x * 2).ToString()));
var sink = Sink.ForEach<string>(output.Add);
var runnable = source.ViaMaterialized(flow, Keep.Left).To(sink);
Keep 属性(Left、Right、Both 或 None)告诉流实现器应该保留流操作指定侧的值。但我注意到,如果我将 Keep.Left 更改为 Keep.Right、Keep.Both 或事件 Keep.None,这不会改变执行结果中的任何内容:接收器将始终根据流转换函数接收输出。
我认为在流图中为 Flow 阶段使用 non-None Keep 值对于确保将值发送到接收器是必要的。我一定误解了这个意思,所以我的问题是为什么即使双方都禁用了物化,流也能工作?您能否举例说明在 Left、Right、Both 和 None 之间更改 Keep 值会影响到达接收器的值?
【问题讨论】:
-
这些代码 sn-ps 是 C#,而不是 F#。
标签: scala f# akka-stream