geçiş / desen eşleştirme fikir
Aradım F# son zamanlarda, ve ben büyük olasılıkla bir sıçrama çit yakın bir zamanda, kesinlikle olayları bazı alanlarda nerede C# (veya kütüphane desteği) olabilir yapmak hayat daha kolay.
Çok zengin bir sözdizimi - koşullu C/geçerli geçiş çok daha etkileyici sağlayan özellikle, desen F yeteneği eşleşen düşünüyorum#,# eşdeğerleri. Doğrudan bir örnek versem daha iyi olmaz (benim F# değil o kadar), ama Kısacası sağlar:
- türü (ayrımcılık sendikalar için tam kapsama kontrolü ile) [not bu da bağımlı değişkenin türü, üye erişim vb vererek algılar] maç
- yüklem ile maç
- yukarıdaki kombinasyonları (ve muhtemelen benim bilmediğim başka bir senaryo)
Süre iyi olur C# sonunda ödünç [HIM] bazıları bu zenginliği, Ara aradım ne yapılabilir çalışma zamanında örneğin, bu oldukça kolay knock birlikte bazı nesneler için izin:
var getRentPrice = new Switch<Vehicle, int>()
.Case<Motorcycle>(bike => 100 bike.Cylinders * 10) // "bike" here is typed as Motorcycle
.Case<Bicycle>(30) // returns a constant
.Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 car.Doors * 20)
.Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 car.Doors * 20)
.ElseThrow(); // or could use a Default(...) terminator
getRentPrice bir İşlev<Araç,int>.
[not - belki/diye burada yanlış terimler... ama fikir gösterir Anahtarı]
Bana, bu eşdeğer daha bir sürü net/eğer başka bir tekrarlanan, ya da bir bileşik üçlü koşullu önemsiz olmayan ifadeler parantez galore için çok karışık olan) kullanıyor. Bunu da önlerçokdöküm ve sağlar için basit bir uzantısı (ya doğrudan ya da üzerinden uzatma yöntemleri) daha özel maçlar için örnek bir İnRange(...) maç karşılaştırılabilir VB Select...Case "x y" kullanımı.
Eğer yukarıdaki gibi yapıları (dil desteği yokluğunda) çok faydası olduğunu düşünüyorum eğer ölçmek için çalışıyorum?
Yukarıdaki 3 türevleri ile oynuyorum ayrıca not:
- bir İşlev<TSource,TValue> değerlendirme için sürüm - kompozit üçlü koşullu ifadeler karşılaştırılabilir
- bir Eylem<TSource> sürüm - eğer/else if/else else//eğer başka bir karşılaştırılabilir
- İfade<İşlev<TSource,TValue>> sürümü - ilk olarak, ama keyfi ETMENİZ sağlayıcılar tarafından kullanılabilir
Ayrıca, İfade tabanlı sürümünü kullanarak İfade ağacı yeniden yazmak, aslında bir tek bileşik koşullu ifadede tüm dalları satır içi uygulaması, tekrarlayan çağırma kullanmak yerine sağlar. Son zamanlarda kontrol etmedim ama biraz erken Varlık Çerçeve İnvocationExpression çok olmadı bu hatırladığım kadarıyla gerekli oluşturur. Ayrıca sağlar daha verimli kullanımı ile SERİ-Nesneler, beri önler tekrarlanan temsilci çağırmaları - test sonucunu beklemekten başka yapacak bir maç gibi yukarıdaki (kullanarak İfade şekli) sahne aynı hız [oldukça hızlı, olguya göre eşdeğer C# bileşik koşullu deyim. Kabul, İşlev<...> tabanlı sürümü aldı 4 kat daha uzun olarak C# koşullu deyim, ama hala çok hızlı ve olası bir büyük darboğaz içinde en kullanım durumları.
/ Giriş / eleştiri / etc yukarıdaki herhangi bir düşünce hoş geldiniz (ya da daha zengin C olanaklarını# dil desteği... umarım öyle olur ;-p).
CEVAP
Bart De Smet excellent blog tarif tam olarak ne üzerine 8 bölümlük bir dizi var. İlk bölümü here bul.
'In Scala desen eşleştirme sistem...
Nasıl atomik silme tuşları desen Redis...
'Desen Eşleştirme' fonksiyon...
Nasıl Scala desen eşleştirme koduna dü...
Lua desen eşleştirme vs düzenli ifadel...