bir işlev` type` o`implicit` parametreleri
Scalatype F = (Int, Boolean)(implicit String) => Unit
gibi bir şey ilan etmek nasılsa mümkün mü Declare? "Işlevi" ve "yöntemi" arasında Scala çok önemli bir fark vardır
bir işlev` type` o`implicit` parametreleri
Scalatype F = (Int, Boolean)(implicit String) => Unit
gibi bir şey ilan etmek nasılsa mümkün mü Declare? "Işlevi" ve "yöntemi" arasında Scala çok önemli bir fark vardır
:
Fonksiyonlar değerlerdir ve variadic olamaz, polimorfik olamaz, by-name argümanlar alamaz aşırı yüklenemez ve örtük parametreler olamaz. Yöntemler bunlara sahipken, bunlar değerler olarak geçemezler.
Fonksiyon tipleri aşağıdaki biçimde, standart kütüphanesinde sadece özellikler şunlardır: bu tür apply
yöntem değil nasıl yaptığını
trait FunctionN[T1, ..., TN, R] {
def apply(x1: T1, ..., xN: TN): R
}
Not örtük bir parametre listesi var. Bu nedenle, işlevlerin hiçbir zaman gizli parametreleri olmayacaktır.
Yani örtülü parametreleri almak "işlevleri" geçirmek istiyorsanız, kendi özelliği oluşturmalısınız:
trait Function2I1[T1, T2, I1, R] {
def apply(a1: T1, a2: T2)(implicit i1: I1): R
}
type F = Function2I1[Int, Boolean, String, Unit]
Şimdi (parlak lambda sözdizimi ile değil de olsa) tip F
örneklerini oluşturabilirsiniz:
val f = new F {
override def apply(x: Int, y: Boolean)(implicit z: String): Unit = ???
}
implicit val x = "hi"
f(1, true) // implicitly passes x
sadece (Int, Boolean) => String => Unit
yazma, örtük parametre olmadan curried fonksiyonları istiyorum. Eğer bir işleve bir yöntem dönüştürmek istiyorsanız
, bir lambda kullanın: Ben yorum sildi
class A {
def f(a: String)(implicit b: String): String = a + b
}
val a = new A
val m = a.f(_) // takes the implicit in this scope
Maalesef öyleydi "Tür f = (Int, Boolean) => (String) yapabilir => Yine de birim ". Bunun dolaylı olarak işe yaramadığını söylemekte haklısınızdır, sanırım çünkü bu türlere bağlı kalmamalısınız. Bir Int ve Boolean alan bir işlev, kapsamdaki implikasyonlardan bağımsız olarak bir Int ve Boole içeren bir işlevdir. düzenleme: Tamam, aşağıda yanıtı açıklandı, bir yöntem bir işlev değildir ve işlevlerin bir anlamı yoktur. –