Örneğin, silme sınıfı almak için def a[A:ClassManifest]
işlevindeki bildirime erişmem gerekiyor. Predef.implicitly işlevini kullanabilirim ancak bu durumda kodum def a[A](implicit b:ClassManifest[A])
tam formunu kullanmış olduğum sürece olacaktır. Bu örtük argümanlar için uygun üretilmiş isimler var mı? sırasıyla manifest[T]
, classManifest[T]
ve optManifest[T]
:"Kapalı" olarak nasıl örtülü olarak erişebilirim, yani [A: B] veya [A <% B] hatalarını nasıl çözebilirim?
cevap
Manifest
s için yapacak Predef
içinde önceden tanımlanmış üç yöntemleri, ClassManifest
ler ve OptManifest
ler vardır. Aynı modele göre diğer tür sınıflar için kendi "gizli alıcıları" yazabilirsiniz. Yani burada
def manifest[T](implicit m: Manifest[T]) = m
Kendi yazabilirsiniz nasıl: Burada örneğin manifest[T]
içindir kurtarmaya
trait UsefulTypeclass[A] {
def info = 42 // sample method
}
// the “implicit getter”
def usefulTypeclass[A](implicit tc: UsefulTypeclass[A]) = tc
// a method that uses the implicit getter
def foo[A: UsefulTypeclass] =
usefulTypeclass[A].info
Düzgün bir hile olarak: örtülü alıcıyı "uygula" olarak adlandırır ve UsefulTypeclass'ın eşlik eden nesnesine eklerseniz, "UsefulTypeclass [T]" öğesinin T için tipeclass örneğini temsil eden bir değer olarak kullanabilirsiniz. typeclass kendisi. –
@RM Güzel numara. O zaman UsefulTypeclass [T]() '(extra'() ') ile olmalı. –
Aslında parense ihtiyacı yok. Eğer varsa (biçimlendirme eksikliğinden dolayı) nesneyi TC {def geçerlidir [T] (örtülü x: TC [T]) = x} "uygula" tanımlandığından dolayı sadece "TC [SomeClass]" ile tam anlamıyla çağırabilirsiniz. örtük bir parametre listesiyle parametresiz bir yöntem olarak ve [SomeClass] bunu yalnızca TC nesnesine yapılan bir referanstan ayırır. TC.apply [SomeClass] (theImplicitValue) –
Scalap!
Bu kodu aldı:object TestThing extends App {
def one { println("one") }
def two[T] { println("two") }
def three[T : Manifest] { println("three") }
def four[T: Manifest, U : Manifest] { println("four") }
}
ve Scalap aracılığıyla koştu.
object TestThing extends java.lang.Object with scala.App with scala.ScalaObject {
def this() = { /* compiled code */ }
def one : scala.Unit = { /* compiled code */ }
def two[T] : scala.Unit = { /* compiled code */ }
def three[T](implicit evidence$1 : scala.Predef.Manifest[T]) : scala.Unit = { /* compiled code */ }
def four[T, U](implicit evidence$2 : scala.Predef.Manifest[T], evidence$3 : scala.Predef.Manifest[U]) : scala.Unit = { /* compiled code */ }
}
Gördüğünüz gibi, ilk örtük Manifest evidence$1
denir: Burada ne var yani. İkinci ve üçüncü - farklı bir kapsamda olsa! — evidence$2
ve evidence$3
olarak adlandırılır. Yani ... bu, Manifesto'lara referans yapıyorsunuz. Bununla birlikte, buna rağmen, sınıfta daha yüksek olan bir Manifest'in kaldırılmasının, dosyada daha aşağıda bulunan bir Manifest'in adını değiştireceğine biraz korkutucu geliyor gibi görünmektedir. Benzer şekilde, IntelliJ Scala eklentisinin sözdizimi vurgulamasının, four()
kapsamındaki Manifest değişkenlerinin evidence$1
ve evidence$2
olduğunu düşünmesine de yardımcı olmadığı ve evidence$3
'un geçerli bir değişken olduğunu düşünmüyor (ve evidence$1
değil). Genel olarak, bu tür şeyler örtülü Manifest değişkenleri ile oynamaya dair uyarı işaretleri olarak düşünülmelidir?
- 1. "a/b/c" öğesini "a/b/c", "a/b", "a" olarak dönüştürmenin en kolay yolu
- 2. b sıfır olmadığında her zaman (a/b * b) + a% b == a `var mı?
- 3. piton - sadece 'a', 'b' veya
- 4. Neden Numpy a + = b ve a = a + b farklı davranır
- 5. Nasıl A $ B $ C $ D veya A% B% C% D A $$$ B itibaren $$$$$$ C $$$$$$$$$ D string in SQL Server?
- 6. A/B çerçeve?
- 7. A/B testi alaka
- 8. [: b (lvar)] 'ı Clojure core.logic dosyasındaki [[: a: A] [: b: B] [: c: C]] sayfasından nasıl kaldırabilirim?
- 9. Python Atama Operatörü Önceliği - (a, b) = a [b] = {},
- 10. Haskell'de "(Num b) => uzunluk :: [a] -> b" nasıl anlaşılır?
- 11. Açısal ve A/B testleri
- 12. Perl'in "sort()" işlevinde tam olarak "$ a" ve "$ b" nedir?
- 13. "Ya a b" türüyle nasıl eşleşiyorsunuz?
- 14. farkı ne:, (a, b) = (1,2)
- 15. CSS spritelarıyla nasıl canlandırma yapılır (A veya B)?
- 16. Bir SQL sorgusunda A (A \ B) tablosundaki B tablosunun göreceli tamamlayıcısı nasıl seçilir?
- 17. A ve B noktaları arasında ses çalma
- 18. Köşeli 2: Bileşen A, B bileşenini güncellediğinde B
- 19. Mongoid ile "(A VEYA B) VE (A VEYA C)" sorgularını nasıl yazıyorsunuz?
- 20. HTTP yönlendiriciden geçmek (Site A, B, C - A - C)?
- 21. Neden (+) işlevi (a -> b -> b) ile eşleşiyor?
- 22. B Sınıfı değişkenini A sınıfına geçirme, eğer A sınıfı B Sınıfı
- 23. DMS olmadan sitecore'da A/B bölünmüş testi
- 24. SQL SELECT (a = "") Daha sonra b değerini
- 25. R - A, B ve * en yakın * C?
- 26. Magnolia'ya A/B testi entegre edin
- 27. Tamsayı çözümü hakkında a + b + c = 2
- 28. varlık çerçevesi: "A = substring (B)" kuralına katıl?
- 29. İki diziler, A ve B. Başka dizide
- 30. Çağrı Git fonksiyonu (B uygulayan A)
Her zaman daha küçük bir ada sahip bir yöntem bildirebilirsiniz, ancak Scalac tarafından oluşturulan sihir adlarına bağlı olarak _not_ olmalıdır. –