Это ваше определение func
:
val func = {() => acc += 3 }
Давайте посмотрим в РЕПЛ на то, что это тип func
.
scala> val c1 = new C(3)
val c1 = new C(3)
c1: C = [email protected]
scala> c1.func
c1.func
res29:() => Unit = <function0>
На простом английском языке это означает, что «Func относится к функции, которая не принимает никаких аргументов и не возвращает значение.» Unit
означает, что метод ничего не возвращает. Если вы используете Java, то он аналогичен void
как возвращаемый тип. function0
означает, что он принимает 0 аргументов.
Далее, давайте рассмотрим неудачный вызов в вашем примере.
scala> c1.func(4)
c1.func(4)
<console>:10: error: too many arguments for method apply:()Unit in trait Function0
c1.func(4)
^
Теперь, когда мы знаем, что метод подписи func
, это сообщение об ошибке должно иметь больше смысла.Мы знаем, что func
ссылается на функцию, которая не принимает аргументов, но в этом вызове вы попытались вызвать ее с помощью одного целочисленного аргумента. Поскольку вызов метода имеет слишком много аргументов, Scala корректно сообщает об этом как об ошибке.
Я не совсем уверен, что вы пытались сделать, передав 4
в качестве аргумента. Лучше всего предположить, что вы пытаетесь применить функцию для вычисления ее результата, добавив 3
в acc
, а затем вернув ее вызывающему. Если я прав, то мы можем переопределить C
как это:
class C(var acc:Int) {
val minc = (acc + 1)
val func =() => {
acc += 3
acc
}
scala> val c1 = new C(3)
val c1 = new C(3)
c1: C = [email protected]
scala> c1.func()
c1.func()
res44: Int = 6
Когда мы называем c1.func()
, никаких аргументов не передается, поэтому он правильно соответствует определенному методу подписи.
Другая возможность заключается в том, что вы пытались параметризовать сумму приращения и передать 4
ему в вызове. Если это так, то вы можете сделать это:
class C(var acc:Int) {
val minc = (acc + 1)
val func = (delta: Int) => {
acc += delta
acc
}
}
scala> c1.func(4)
c1.func(4)
res45: Int = 7
В этом случае, мы заявили, что анонимная функция принимает 1 аргумент типа Int
, поэтому, когда мы проходим 4
в вызове метода, он правильно соответствует сигнатуру метода ,
Благодарим вас за разъяснение! Тем не менее, я все еще вижу ошибку, когда пытаюсь получить ценность из функции. класс с (согласно: Int) { вал MiNC = (соотв + 1) вал FUNC =() => соотв + 3 } вал c1 = новый C (5) c1.minc печати 6 но, c1.func prints res23:() => Int = Я ожидаю выход 8 из этого объекта. Есть ли какой-либо другой метод, который я должен использовать для получения значения из func? –
GoldenPlatinum