Scala bir yöntem tanımlamak için Dokuz yollar?
Scala şeyler tanımlamak için çeşitli yollar, {}
blok muameleyi anlayış benim eksikliği ile komplike ile bulmaca için çalışıyorum bu yüzden:
object NewMain extends Thing{
def f1 = 10
def f2 {10}
def f3 = {10}
def f4() = 10
def f5() {10}
def f6() = {10}
def f7 = () => 10
def f8 = () => {10}
def f9 = {() => {10}}
def main(args: Array[String]){
println(f1) // 10
println(f2) // ()
println(f3) // 10
println(f4) // 10
println(f4()) // 10
println(f5) // ()
println(f5()) // ()
println(f6) // 10
println(f6()) // 10
println(f7) // <function0>
println(f7()) // 10
println(f8) // <function0>
println(f8()) // 10
println(f9) // <function0>
println(f9()) // 10
}
}
Muhtemelen bunlardan bazıları eşittir, bazıları diğerleri için sözdizimsel şeker ve işime gereken şeyler var, ama bana yaşam için bunu bir türlü çözemiyorum. Benim belirli bir soru vardır:
Nasıl
println(f2)
println(f5())
unit
verir? Son madde blok10
değil mi? Nasıl10
verenprintln(f3())
, benden ne farkı var?println(f5)
unit
,println(f5())
geçersiz olması gerekmiyor verirse,unit
bir işlevi olmadığı için mi? Aynıprintln(f6)
println(f6())
için geçerlidir10 yazdırma olanlar:
f1
,f3
,f4
,f4()
,f6
,f6()
,f7()
,f8()
,f9()
, aralarında herhangi bir işlevsel fark ne açısından) ya da kullanım farklılıkları (hangisini kullanmalıyım zaman açısından) var mı? Veya eşdeğer?
CEVAP
Sırayla sorularınıza cevap vereyim
f2
f5()
dönüşUnit
çünkü scala alır herhangi birdef
olmadan bir "=
" bir işlev döndürenUnit
ne olursa olsun, ne son madde bir bloktur. Aksi takdirde bu oldukça ayrıntılı bir şey döndüren bir işlev tanımlamak için olmaz, çünkü iyi bir şeydir.println(f5())
scalaUnit
kuşkusuz olmasa da geçerli bir nesne değildir, çünküUnit
bir örneğini oluşturabilir döndürür olsa bile geçerlidir.Unit.toString()
geçerli, yoksa genel olarak yararlı bir açıklama, örneğin.10
baskı tüm sürümleri aynı. En önemlisi,f7
,f8
f9
aslında10
döndürme yerine10
doğrudan döndüren fonksiyonlar döndüren fonksiyonlardır.def f8 = () => {10}
, bildirdiğinizde herhangi bir argüman ve döndüren 41* *bir işlevi, bağımsız değişken ve döner tek bir tamsayı alır bir işlevi beyan ediyorsunuz.println(f8)
ardından çağırmakf8
dilligently seni işlevi döndürür.println(f8())
çağırdığınızda işlevi döndürür, hemen çağırır.- Fonksiyonları
f1
,f3
,f4
,f6
ne açısından eşdeğerdir, stil açısından tek farklılık gösteriyorlar.
"Bilinmeyen kullanıcı", parantez sadece kapsam açısından önem ve kullanma durumu burada herhangi bir fark yaratmıyor. gösterir gibi
Neden önemli GetHashCode yöntem geçers...
Ne'In PHP?ile kullanıcı girişi st...
Genel yöntem oluşturmak bir Numaralama...
Teknikleri JavaScript bir sınıf tanıml...
Java singleton deseni uygulamak için e...