2016-02-09 19 views
5

, ben PDF 79. sayfasında şu gördüğümüz: içteki ForEach yerine çeviri tarafından üretilen kullanıcı kodundan iseNeden bir özel hesaplama ifadesi oluşturucuda Builder.Source() kullanıyorsunuz? <a href="http://fsharp.org/specs/language-spec/" rel="noreferrer">F# 4.0 spec</a> okumak,

yardımcı fonksiyon src(e)b.Source(e) gösterir ve bir inşaatçı bSource yöntemini içerir. Aksi takdirde, src(e), e'u belirtir.

Bu, hesaplama ifadelerinin nasıl ayrıştırıldığına ve ifadenin oluşturucu nesnesine bir dizi yöntem çağrısına dönüştürüldüğüne ilişkin ayrıntının ayrıntılı (ÇOK ayrıntılı) açıklaması bağlamındadır. Hesaplama ifadelerinin arkasındaki kavramların geri kalanını anlamada bana yardımcı olma konusunda çok değerli bulduğum Scott Wlaschin's Computation Expressions series, Source yönteminden bahsetmiyor ve başka herhangi bir başvuruda bulunamamıştır. (Bu konuda çok fazla yardımda bulunmuyor, çünkü tonlarca insan kaynak kodu hakkında konuşuyor ve Source yöntemine yapılan göndermeler gömülüyor).

Ayrıca, MSDN page on computation expressions adresindeki herhangi bir yerde Source belgesini göremiyorum. QueryBuilder class, Source kullanıyor, bu yüzden bakabileceğim bir örneğim var, ancak bunun diğer durumlarda neden yararlı olabileceğine dair bir açıklama yok.

Özel bir hesaplama ifadesi oluşturucuda hangi koşullarda Source yöntemine sahip olmak istersiniz? Varsayılan ForEach kullanımının birinin ihtiyaçları için yetersiz olduğu ve Source yönteminin yararlı olacağı bir senaryo ne olurdu?

+0

@mydogisbox - Bağlantı için teşekkürler, ancak bu sayfayı daha önce gördüm. Kaynak() 'in' in 'içeriğinin içeriğiyle çağrıldığının farkına varıyorum (yani' x'de öğe için 'Kaynak (x)' 'ye bir çağrı üretir). Ve 'Kaynak'ın' For''a geçmek için uygun bir şey döndürmesi gerektiğini anlıyorum. Tam olarak neden göremiyorum * neden *. 'QueryBuilder.Source' ya IEnumerable veya IQueryable (IEnumerable öğesinden devralınır) ister, her ikisi de bir 'For' işlevi üzerinde yineleme için uygundur. O zaman neden kaynak aranıyor? Neden sadece "Bana bir IEnumerable verdiler, bu yüzden üzerinde yineleyeceğim" deme? – rmunn

+0

Sanırım aynı şey hakkında konuşuyoruz, ne demek istediğimi açıklamak için bir yorumda yeterli yer yoktu. "For' hakkında konuşuyorum "QueryBuilder.For 'ifadesiyle' '' '' d için müşteri sorgusu '' sorgusu '' çağrılır. – rmunn

cevap

4

Bu konuda herhangi bir içsel bilgiye sahip değilim, ancak bu nedenle, bu yöntemin, QueryBuilder içinde bulunan çeviriye ve uygulamaya dayalı olarak var olduğunu düşünüyorum. IEnumerable veya IQueryable ya da - QueryBuilder içinde

tüm işlemler 'R elemanlarının türü olup 'Q veri kaynağının tür QuerySource<'R, 'Q> kullanarak veri kaynağı temsil eder.

olduğu gerçeği sadece bir veri türü bu IQueryable ve IEnumerable için ayrı aşırı yükleri tanımlamak gerek olmadığı anlamına gelir - sonunda Run yöntem IEnumerable ve IQueryable için farklı şeyler yapmak gerektiğinden ihtiyaç duyulacak olan.

Yani, Source yöntemi, sorgunun hangi veri girişinin "dahili gösterimi" ne üzerinde çalışabileceği girdileri dönüştürmenize izin verir. Karşı uçta, Run yöntemi, bu iç gösterime ait verileri sıradan değere dönüştürür. (QueryBuilder durumunda, kendi kodunuzda QuerySource türünü göremezsiniz.)

+0

"Kaynak" yöntemi, sorgudaki herhangi bir girdiyi veri kaynağının bazı "içsel gösterimi" üzerinde çalıştırabilmenizi sağlar. Diğer ucunda, "Çalıştır" yöntemi verileri bu iç gösterime göre sıradan değere dönüştürür ." - Bu, benim için "tıklat" yapan bir cümleydi. Teşekkürler, ihtiyacım olan açıklama buydu. – rmunn

İlgili konular