将表达式作为fucntion参数传递时出错

时间:2016-09-01 16:52:44

标签: scala

scala> def sum(a:Int)={a} //I have defined the function with a single parameter
sum: (a: Int)Int

sum{val b=10+20} //passing the parameter as expression block

Getting error

scala> sum{val b=10+20}
<console>:9: error: type mismatch;
 found   : Unit
 required: Int
              sum{val b=10+20}

为什么期待Unit

3 个答案:

答案 0 :(得分:4)

错误是{val b = 10 + 20}属于Unit类型而sum期待Int

您可以直接调用sum而不指定变量:

sum(10 + 20)
> 30

或者让块返回Int,如:

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

答案 1 :(得分:0)

您不传递表达式,而是传递具有一个声明的块。尝试:

sum(10+20)

您遇到了语法错误和类型系统约定的奇怪组合。

花括号标记一个块(参见例如sum函数声明的主体)。函数参数可以并置或使用括号传递。那是你的语法错误。

类型系统约定允许具有副作用的语言将这些效果轻轻地插入到基本上任何表达式中。这通过将语句的组成(即分号)视为“评估这些表达式但对结果不做任何事情,然后评估下一个表达式”来实现。 没有结果部分与单元类型组合,用于不计算任何内容的语句。

答案 2 :(得分:0)

def sum(a:Int)={a} 

此语句的作用是创建一个方法,该方法接受一个Int类型的参数并返回它。

sum{val b=10+20}

在这里,您将值传递给定义的方法sum。你传递的是一种表达方式。 Scala会有效地重写&#39;该表达式在应用于sum之前。如果我们在REPL中编写传递的表达式(val b=10+20),我们将看到它被重写为:

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

但这只是故事的一部分,因为为名称赋值不会返回任何内容。我们可以通过在作业周围加上括号来看到这一点:

scala> { val b=10+20 }

请注意,发生这种情况时,REPL不会显示任何内容。

由于重写的表达式包含此评估,因此您实际上将范围传递给定义了b的函数。但是,该范围不会返回&#39;要Int绑定的a。要返回b作业的结果,您必须执行以下两项操作之一。您必须调用变量是表达式中的最后一个调用,或者最后一次调用是计算本身,并且不要将其分配给变量:

sum{ val b=10+20; b } // Explicitly call the bound variable
sum{ 10 + 20 }  // Don't assign the variable