2015-06-23 4 views
1

Я работаю над онлайн-упражнениями, использующими опции и темы, оба из которых у меня очень мало опыта. Онлайн-упражнение поставляется с набором тестов, поэтому прямо сейчас я пытаюсь передать свои тестовые варианты Option перед тем, как перейти к тестовым примерам потоков.Scala - Тип опции Var Manipulation

Вот мой код:

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. Поскольку getBalance был val, он не пересчитывал значение после манипуляции. Тем не менее, все еще потеряно на closeAccount().

+1

Обратите внимание, что account.balance.get генерирует исключение, если баланс равен None (этот вызов по сути убивает цель использования опции). Вам лучше использовать опцию в качестве монады в incrementBalance, например, 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

Смежные вопросы