2016-06-19 24 views
10

Birisi, bu 4 yöntem arasındaki farkın ne olduğunu net bir şekilde açıklayabilir mi? Her birini kullanmak ne zaman daha uygun? Ayrıca genel olarak bu yöntem grubunun adı nedir? Aynı işi yapan daha fazla yöntem var mı? Scaladoc'a bir bağlantı da yardımcı olabilir.Akka Deresi Üzerinden Via/ViaMat/to/toMat

-D

cevap

23

Tüm bu yöntemler, bir akım halinde iki akım katılması için gereklidir. Örneğin, bir Source dışarı Source ve Flow oluşturabilir veya bir Flow ve Sink dışına Sink oluşturabilir veya bir FlowFlow iki takım s oluşturabilir.

Bunun için iki temel işlem vardır, to ve via. Eski bir bağlanmaya izin veren ya da ikinci Source veya FlowFlow bir bir bağlanmaya izin verirken bir Source veya Sink bir Flow: Referans için

source.to(sink) -> runnable graph 
flow.to(sink)  -> sink 

source.via(flow) -> source 
flow1.via(flow2) -> flow 

, bir çalıştırılabilir grafiktir reaktif tam olarak bağlı olan maddileştirilmeye ve yürütülmeye hazır olan akış. Çeşitli işlemlerin sürümleri, işlem içerisine dahil edilen akışların somutlaşmış değerlerinin nasıl birleştirileceğini belirtme olanağını sağlar. Bildiğiniz gibi, her bir akış, akıntı gerçekleştiğinde elde edilebilecek bir maddi değeri vardır. Örneğin, Source.queue, programınızın başka bir bölümü tarafından çalışan akışa öğeler yaymak için kullanılabilecek bir kuyruk nesnesi verir. kaynakları ve akımlarına

Varsayılan to olarak

ve via sadece argümanının gerçekleşmiş değerini görmezden bunun açık denir akışının hayata değerini tutar: Bazen

source.to(sink) yields mat.value of source 
source.via(flow) yields mat.value of source 

flow.to(sink)  yields mat.value of flow 
flow1.via(flow2) yields mat.value of flow1 

Ancak, her iki tutmak için gereken maddi değerler veya bunları bir şekilde birleştirmek için. Bu, Mat yönteminin varyantlarına ihtiyaç duyulduğunda.

source.to(sink) equivalent to source.toMat(sink)(Keep.left) 
flow1.via(flow2) equivalent to flow1.viaMat(flow2)(Keep.left) 

Örneğin, Keep.both yöntemi kullanabilir, her iki değeri hayata tutmak, ya da eğer: Bunlar kombine akımın bir hayata değeri hem de işlenen hayata değerleri alır ve döner birleştirme işlevini belirlemek için izin

source.toMat(sink)(Keep.both) yields a tuple (mat.value of source, mat.value of sink) 
+0

Bu büyük bir büyük bir cevap, çok düzgün: sadece "doğru" terimin mat.value gerekiyorsa, Keep.right yöntemi kullanabilirsiniz! Bu arada sadece bir noktayı açıklığa kavuşturmak için. Ben source.to (sink) olarak varsayılan varsayılan kaynak değerini (sol) olarak tutmak garip buluyorum. Lavabo bir kıvrımsa, katlamanın sonucuyla ilgileneceğime inanıyorum. Bu durumda, tek yolu tomat kullanmak olacaktır. Aslında sadece varsayılan değeri sol değerini kullanmak iken en sık kullanım durumu doğru değer ile devam etmektir. Belki bunun hakkında birkaç yorum yapabilirsin. Bunu doğru şekilde düşünemiyorum. – MaatDeamon

+0

@MaatDeamon, bunun nedenlerini tam olarak bilmiyorum, ancak tüm bu işlemlerin genel olarak hem "Kaynak" hem de "Akış" ın bir supertraitunda uygulandığı gerçeğiyle bağlantılı olabilir, bu nedenle bazı işlemlerin bazı parametreleri 'Aktarım' için anlamı 'Kaynak' için daha az anlam ifade edebilir ve bunun tersi de geçerlidir. –