2014-03-28 45 views
3

初始化斯卡拉變量我有這個斯卡拉情況下類:與選項

case class Foo 
    (bar: String, 
    original_bar: Option[String] = None) 

我想設置original_bar默認=欄(所以original_bar始終爲默認的一些(巴)),如:

case class Foo 
     (bar: String, 
     original_bar: Option[String] = Some(bar)) 

但我得到:沒有找到:值欄,我也嘗試了一些(Foo.bar),但沒有運氣。有沒有辦法在case類中設置默認值,或者我在初始化Foo對象時必須設置它?由於

+0

類似的問題:http://stackoverflow.com/questions/21508939/reference-scala-constructor-args-in-default-value – tuxdna

回答

1

因爲,在original_bar總是要使用bar的值進行初始化,爲什麼不申報的情況下,像這樣:

case class Foo(bar: String){ 
    val original_bar: Option[String] = Some(bar) 
} 

另外,如果您bar將被改變,其聲明爲var

case class Foo(var bar: String){ 
    val original_bar: Option[String] = Some(bar) 
} 

編輯

這將做你的評論描述:

試試這個:

case class Foo(bar: String, original_bar: Option[String]) { 
    def copy(bar1: String): Foo = Foo(bar1, this.original_bar) 
} 

val a = Foo("a",Some("a")) 
a.bar // This gives 'a' 
a.original_bar // This gives Some("a") 

val b = a.copy("b") 
b.bar // This gives 'b' 
b.original_bar // This gives Some("a") 
+2

它不會**總是**初始化爲「一些(酒吧)」。例如'Foo(「bar」,Some(「baz」))',至少從op的問題中不太清楚 –

+0

但是,這不是OP要求的嗎?或者我只是錯過了這個問題的重點? – Peter

+0

我編輯了這個問題。我想要original_bar always = Some(bar)。目前,如果我想更改bar,我使用Foo.copy(bar =「new_bar」)。我想擁有原始欄的副本,因此欄可以更改,但我仍然知道它的原始值是多少。我用val test1 = Foo(bar =「test1」)val test2 = test1.copy(bar =「test2」)測試了代碼。 test2.original_bar變成test2 :(我希望它是test1 – Duc

7

我不認爲你可以做的是,在主構造。這裏是一個另類:

case class Foo(bar: String, original_bar: Option[String]) 

object Foo { 
    def apply(bar: String): Foo = new Foo(bar, Some(bar)) 
} 
3

您可以使用多個參數列表:

case class Foo(bar: String)(val original_bar: Option[String] = Some(bar)) 

這應該工作:

scala> case class Foo(bar: String)(val original_bar: Option[String] = Some(bar)) 
defined class Foo 

scala> Foo("123")().original_bar 
res79: Option[String] = Some(123) 

然而,這會干擾情況下級的功能,例如,您將無法在第二個參數列表上進行模式匹配。

+0

這不起作用。我自己也在想同樣的事情:'Foo(「Hello」)(_)'returns'res1:Option [String] => Foo = ' – tuxdna

+0

您必須編寫'Foo(「Hello」)()'。嘗試一下,它確實有效。我在REPL中檢查過它。 –