2011-03-17 12 views
9

Sana sık sık değişen argüman olarak bir dosya adı varsaBağımsız değişkenlerin val yerine var olmasına izin verilmesinin bir yolu var mı? Java işleme komut satırı argümanı ayıklarken

args = new String[] { "some", "new", "arguments" }; 

(özellikle yararlı yapmaya alışığım, ama bazı iletişim pencerelerden gitmek istemiyorum IDE). Bu, bir sürüm oluştururken çizgiyi basitçe yorumlayabilmemin yararına sahip.

Scala'da bunu denediğimde, bu argümanların val s olduğunu keşfettim. (Ve parametrenin önüne var yazamıyorum).

  • Q1: mantığı bunun için ne var?
  • Q2: Yani kalan ana yöntemde newArgs için

    val newArgs = if (...) args else Array("some", "new", "arguments") 
    

    ve sopa yapıyor dışında herhangi bariz-etrafında çalışma var mıdır?

cevap

13

S1: giriş parametreleri mutasyona genellikle kötü tarzını görmüş ve kod hakkında ikna etmeye zorlaştırıyor edilir.

S2: Onunla bir şey yapmadan önce bir var için args atayabilir. geçti dizide yeterli alan varsa

Seq("some", "new", "arguments").copyToArray(args, 0, 3) 

çıkarmış, elbette, sadece çalışır: Eğer ısrar eğer öyleyse

+0

Q1, iyi bir noktaya olurdu. Q2, evet. If-line'den daha iyi, çünkü o zaman Java’da olduğu gibi yeniden atamayı açıklayabilirim. Teşekkürler! – aioobe

1

Diziler değişebilir niteliktedir.

Orijinal sorgunuzu daha temiz bir şekilde çözmek için Scala'da varsayılan parametreleri kullanabileceğinizi unutmayın.

+0

Ana yöntem için böyle bir varsayılan parametre örneği verebilir misiniz? – aioobe

+0

Ah, pardon, oraya taşındı. Parametre olmadığı için çalışmaz, boş bir dizi geçilir. Belki de bu bir değişiklik olabilir. – Raphael

0

Yalnızca işlevdeki arşivleri değiştirmek isterseniz, açıklamadaki yaklaşımınız yeterlidir.

case class Ref[A](var value: A) 

Ve kullanılır: Eğer gerçek bir "referans" türü olarak davranın ve işlevi dışında geçerli değişiklikler tutmak gerekiyorsa

Ancak, örneğin, bir vaka sınıfında argümanları içine alabilirsiniz gibi: Eğer işlev dışındaki refInt.value kullandığınızda

def modify(refInt: Ref[Int]) = refInt.value = 3 

Ardından, hala 3.

İlgili konular