2016-09-01 3 views

ответ

4

Ошибка в том, что {val b = 10 + 20} имеет тип Unit в то время как sum ожидает в Int.

Вы можете либо позвонить сумму непосредственно без присвоения переменной:

sum(10 + 20) 
> 30 

Или сделать блок возвращают Int, как:

sum{ 
    val b = 10 + 20 
    b // return b, which is an Int 
} 
> 30 
0

Вы не передаете выражение, а блок с одним объявлением. Попытайтесь:

sum(10+20) 

У вас возникло странное сочетание синтаксической ошибки и условного обозначения системы.

В фигурных скобках отмечен блок (см., Например, тело декларации функции суммы). Аргументы функции могут передаваться в сопоставлении или с использованием скобок. Это ваша синтаксическая ошибка.

Соглашение о системе типов позволяет языкам с побочными эффектами мягко вставлять эти эффекты в основное выражение. Это происходит путем обработки композиции операторов (например, точки с запятой) как «оценивать эти выражения, но ничего не делать с результатом, а затем оценивать следующее выражение». ничего в результате часть сочетается с типом устройства для операторов, которые ничего не вычисляют.

+0

Ошибка синтаксиса в код OP.'Val' - проблема, а не {} –

+0

Я предполагаю, что OP не хочет передавать блок, а скорее простой аргумент. Таким образом, он, вероятно, * является * синтаксической ошибкой на его/ее части. Тот факт, что это фактически синтаксически допустимое выражение, кажется, является чисто совпадением. – choeger

+0

Точно. Синтаксическая ошибка отсутствует. Без val это работает 'sum {10 + 20}' –

0
def sum(a:Int)={a} 

Что это заявление делает это создать метод который принимает один параметр Int и возвращает его.

sum{val b=10+20} 

Здесь вы передаете значение для вашего определенного метода sum. То, что вы проходите, является выражением. Фактически Scala «переписывает» это выражение перед его применением до sum. Если мы напишем выражение, которое передается (val b=10+20) в РЕПЛ мы увидим, что она будет переписан:

scala> val b=10+20 
b: Int = 30 

Но это только часть истории, так как присвоение значения к имени ничего не возвращает. Мы можем это увидеть, установив скобки вокруг задания:

scala> { val b=10+20 } 

Обратите внимание, что REPL ничего не отображает, когда это происходит.

Поскольку переписанное выражение включает эту оценку, вы фактически передаете область функции, в которой определяется b. Однако эта область не возвращает «Int», которая должна быть привязана к a. Чтобы вернуть результат задания b, вам нужно сделать одну из двух вещей. Либо вы должны иметь вызов переменной, либо последний вызов в выражении, либо последний вызов является самим вычислением, и не присваивать это переменной:

sum{ val b=10+20; b } // Explicitly call the bound variable 
sum{ 10 + 20 } // Don't assign the variable 
Смежные вопросы