2015-11-10 15 views
5

Scala'daki işlevsel programlama kursunu izliyorum ve çalışma sayfası repl'inin garip bir davranışını gördüm. Derste Intellij çalışma sayfası ve sınıflar içinde tanımlanmış

sağda aşağıdaki sonuçları vermelidir aşağıdaki kodla bir çalışma sayfası: Ben olsun ne

object rationals { 
val x = new Rational(1, 2)    > x : Rational = [email protected]<hash_code> 
    x.numer        > res0: Int = 1 
    y. denom        > res1: Int = 2 
} 

class Rational(x: Int, y: Int) { 
    def numer = x 
    def denom = y 
} 

object rationals {      > defined module rationals 
val x = new Rational(1, 2)    
    x.numer        
    y. denom        
} 

class Rational(x: Int, y: Int) {  > defined class Rational 
    def numer = x 
    def denom = y 
} 

Sadece aldığım object içine class taşıdıktan sonra ise koddakiyle aynı sonuç.

  • Bu Intellij tarafından mı kaynaklandı, yoksa Scala'da değişiklikler oldu mu?
  • Bunun etrafında başka yollar var mı?
+3

Bu birlikte değerlendirilecektir

object Primes { val primes = 2l #:: Stream.from(3, 2).map(_.toLong).filter(isPrime) val isPrime: Long => Boolean = n => primes.takeWhile(p => p * p <= n).forall(n % _ != 0) } 

gibi bazı nesne içindeki bu tür Alt satıra bazen çok kullanışlı IntelliJ çalışma sayfası davranıştır. Sadece '' val's ve ifadelerini – Odomontois

+0

@Odomontois Nesneleri dışında yazın, işe yarıyor. Ama hala onun ne olduğunu görmüyorum? – Lukasz

+0

Bazı 'val' tanımları bazen sıralı olarak değerlendirilmemelidir. “Nesne” henüz tam olarak başlatılmadığı için, “toString” aşamasında atılan tembel val'ler veya istisnalar arasında karmaşık bağımlılıklar olabilir. Yani IDEA'da bu tür kötü şeyleri nesneler içine koyabilirsiniz, Eclipse'de başka bir seçeneğiniz yok. Bunları ayrı bir kaynak haline getirebilirsiniz. – Odomontois

cevap

7

IntelliJ IDEA scala çalışma sayfasında, objects içindeki değerleri Eclipse/Scala IDE'den farklı olarak işler.

Nesnelerdeki değerler doğrusal dizi modunda değerlendirilmez, bunun yerine normal scala nesnesi olarak değerlendirilirler. Açıkca kullanana kadar bu konu hakkında bilgi göremezsiniz.

gerçekte val ler ve ifadeler sadece tanımlamak veya bazı durumlarda bir kurtarıcı olabilir herhangi bir nesne \ sınıfının

Bu davranış dışında onları değerlendirmek görmek için. Bu tanımlara sahip olduğunuzu varsayalım.

isPrime basit def coulbe
val primes = 2l #:: Stream.from(3, 2).map(_.toLong).filter(isPrime) 

    val isPrime: Long => Boolean = 
    n => primes.takeWhile(p => p * p <= n).forall(n % _ != 0) 

Not olduğunu, ama biz nedense val olarak tanımlamak için seçilecek.

Böyle bir kod hoştur ve normal bir scala kodunda çalışır, ancak çalışma sayfasında başarısız olur, çünkü val s tanımları çapraz referanslıdır.

Ama bunu Hiçbir sorun

İlgili konular