2015-06-23 33 views
1

我正在從事練習選項和線程的在線練習,兩者都很少有經驗。在線練習附帶一個測試套件,所以現在我正試圖讓我的選項測試用例通過,然後再進入線程測試用例。斯卡拉 - 選項類型變量操作

這裏是我的代碼:

case class BankAccount() { 
    def getBalance = account.balance 

    def incrementBalance(amount: Int): Option[Int] = { 
    account.balance = Some(account.balance.get + amount) 
    getBalance 
    } 

// def closeAccount(): Option[Int] = { 
// account.balance = None: Option[Int] 
// } 
} 

object account { 
    var balance = Some(0) 
} 

我有closeAccount()註釋掉,因爲它目前給我一個錯誤說,它期待型Some[Int] instead of Option[Int]。考慮到我已初始化balance可以理解。我不確定如何從Some[Int]的值變爲None,如closeAccount()所示。

任何幫助將不勝感激,在得出這個想法。先謝謝你。

首先編輯:我想出了我用incrementBalance做出的那個愚蠢的錯誤。由於getBalanceval,因此不會在操作後重新計算該值。儘管如此,仍然輸給了closeAccount()

+1

請注意,如果balance爲None,account.balance.get會拋出一個異常(這個調用實質上是殺死了使用Option的目的)。您最好在OptionBalance中使用Option作爲monad,例如,account.balance.map(_ + amount) –

+0

我遇到了問題!之後我重構了我的代碼,使用'case switch'來檢查它是否是'Some [Int]'或'None'。謝謝你的建議,以及:) – lmcphers

回答

3

var balance = Some(0)被推斷爲Some[Int]型的,當你需要明確地告訴這一點,這是Option[Int]類型:

var balance: Option[Int] = Some(0) 

然後balance將能夠採取任何Some(0)None

順便說一句,有時總是使用Option(...)而不是Some(...)。這是因爲Some(null)將變成Some(null)Option(null)將變成None,這是我們通常想要的。

+1

足夠簡單和愚蠢的疏忽代表我。感謝您的建議。它解決了這個問題,但仍然有一些東西篡改現在似乎我已經處理了。 – lmcphers