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
Ошибка синтаксиса в код OP.'Val' - проблема, а не {} –
Я предполагаю, что OP не хочет передавать блок, а скорее простой аргумент. Таким образом, он, вероятно, * является * синтаксической ошибкой на его/ее части. Тот факт, что это фактически синтаксически допустимое выражение, кажется, является чисто совпадением. – choeger
Точно. Синтаксическая ошибка отсутствует. Без val это работает 'sum {10 + 20}' –