2015-12-02 7 views
0
case class Item(val brand: String, val count: Int) 

class Inventory { 
    def add(amount:Int, item: Item): Item = { 
    if(amount>0)  
    item.copy(count = item.count+amount)  
    } 

    def subtract(amount:Int, item: Item): Item = { 
    if(amount>0) 
    item.copy(count = item.count-amount) 
    } 
} 

Как бы добавить какие-либо выражения к этому коду, чтобы сумма была больше 0? Когда я добавляю оператор if, я получаю ошибку несоответствия типа.Ошибка несоответствия типа (Scala)

+0

Помимо (что очень неважный по сравнению с использованием 'if' ** без **' else') - вы должны правильно отступов вашего 'если-statements' - сделать это читаемо. –

ответ

2

Проблема в том, что функция не всегда возвращается, функции всегда должны возвращать одно значение. Что происходит, когда amount не больше нуля? Я полагаю, вам нужно вернуть item, как есть. Мы исправим это, добавив инструкцию else.

2

if является выражением в scala, поэтому он оценивает что-то. Если вы не ставите компилятор else, поставьте () для вас, который имеет тип Unit. Это сделает ваше выражение возвратом Unit или Item. Их общая супертипом является Any так тип этого выражения эффективно Any в то время как ожидается, тип Item

def add(amount: Int, item: Item): Item = { 
    if(amount > 0)  
    item.copy(count = item.count + amount)  
} 

Если вы хотите, чтобы требовать сумму, чтобы быть больше нуля просто проверить его и выбросить исключение, если это не так. Для этого вы можете использовать встроенный require.

def add(amount: Int, item: Item): Item = { 
    require(amount > 0)  
    item.copy(count = item.count + amount)  
} 

или вы можете справиться с этим молча, и не изменять пункт, если неправильный аргумент передается

def add(amount: Int, item: Item): Item = { 
    if(amount > 0)  
    item.copy(count = item.count + amount) 
    else 
    item 
} 

Кстати, вам не нужно Vals в случае класса, это будет val в любом случае. Вот как это должно быть:

case class Item(brand: String, count: Int) 
Смежные вопросы