2016-04-11 12 views
6

Oldukça saygın bir yazılım şirketi ile yaptığım son röportajda, görünüşte önemsiz bir Scala sorusuna geçerli bir açıklama yapmaya çalıştım. Aşağıdaki ele alalım:Belirtilen değişkeni tutan bir vaka sınıfının bir örneğini döndüren bir yöntem çağırdığımda değişken atamaya ne olur?

Person(10) 

soru bu yüzden ve ben 3person.age atamak zaman ne oluyor: Bu println deyimi ile neyi iade edilir

case class Person(var age: Int) 
def person = new Person(10) 
person.age = 3 
println(person) 

?

+1

En iyi cevap muhtemelen "sadece bir vaka sınıfında kullanmayın" idi. –

cevap

7

Eh,

def person = new Person(10) 

bir işlevdir. Yani, her bir kez person'u aradığınızda, Person'un yeni bir örneğini oluşturursunuz. Eğer ilk oluşturan kişi örneğinin yaşını değiştirmek isterseniz

Person(10).age = 3 
println(Person(10)) 

, o örneği yakalamanız gerekir: Biz işlevini inline eğer böyle Böylece, kodunuz görünürdü. Bunun için

val p = person 
p.age = 3 
println(p) 
8

Eğer val ve def arasındaki farkı anlamak gerekir.

Herhangi bir ifade için def'u kullandığınızda, her kullanıldığında değerlendirilir. Yani, bu durumda bir person.age = 3 yaptığınızda, yeni bir kişi nesnesi örneği oluşturacak ve yaşına 3 atayacak ve println(person) yaptığınızda, yeni bir kişi sınıfı başlatır ve bu nedenle Person(10) yazdırır. Böyle val yerine def varsa

Yani,: val person = new Person(10) ve

person.age = 3 
println(person) 

yapmak çıkışı olacaktır: Person(3), çünkü val kez değerlendirilir. Bu nedenle, person'u ne zaman kullandığınız farketmez, bu durumda yalnızca bir adet person örneği olacaktır.

İlgili konular