Scala编译错误-找到:Int必需:Int=>;Int
我是斯卡拉的新手。我不理解以下代码的编译错误:Scala编译错误-找到:Int必需:Int=>;Int,scala,function,literals,function-literal,Scala,Function,Literals,Function Literal,我是斯卡拉的新手。我不理解以下代码的编译错误: def delayed( t:(Int)=> Int):Unit={ println("In delayed method") var y=t; println(y) } def time(x:Int):Int={ x*2 } 当我打电话的时候 delayed(time(8)) 我得到以下错误: scala> delayed(time(8)) <console>:15: error:
def delayed( t:(Int)=> Int):Unit={
println("In delayed method")
var y=t;
println(y)
}
def time(x:Int):Int={
x*2
}
当我打电话的时候
delayed(time(8))
我得到以下错误:
scala> delayed(time(8))
<console>:15: error: type mismatch;
found : Int
required: Int => Int
delayed(time(8))
^
及
及
您的函数
delayed
期望函数作为参数,但是,您传递了Int
。这就是为什么你会出错
delayed
的参数类型是Int=>Int
,这意味着它是一个函数,接受一个Int
作为参数并返回Int
scala> delayed(time(8))
<console>:14: error: type mismatch;
found : Int
required: Int => Int
delayed(time(8))
^
您的函数time
是Int=>Int
函数,但是,当您将time(8)
传递给delayed
函数时,time(8)
将在传递给delaye
之前进行评估,评估结果只是一个Int
scala> delayed(time(8))
<console>:14: error: type mismatch;
found : Int
required: Int => Int
delayed(time(8))
^
如果要将时间(8)作为函数参数传递,则应将时间更改为返回函数:
scala> def time(x:Int) = () => x*2
您还需要修改delayed
函数,如下所示:
def delayed(t:()=>Int) {
println("In delayed method")
var y=t();
println(y)
}
然后您可以将时间(8)
传递到delayed
scala> delayed(time(8))
In delayed method
16
或者,您可以使用注释中提到的@Tzach的名称调用
scala> def delayed(t: =>Int) {
| println("In delayed method")
| var y = t
| println(y)
| }
delayed: (t: => Int)Unit
scala> def time(t:Int) = t*2
time: (t: Int)Int
scala> delayed(time(8))
In delayed method
16
方法
delayed
需要一个具有输入参数Int
和返回类型Int
但在您的示例中,您正在传递time
函数的结果
这会解决你的问题
delayed(time)
非常感谢你。但是,有没有一种方法可以在延迟函数中传递时间函数,而不必事先计算它?你能告诉语法做同样的事吗?我怎样才能把一个参数传递给time方法呢?谢谢你的回复。还有一件事,请注意,当您编写def delayed(t:=>Int)时,代码可以工作,但是如果我不提供空格b/w:“:”和“=>”,代码将失败,并给出编译错误。这个空格表示什么吗?您能告诉我这行中的参数是什么意思吗-def delayed(t:=>Int)?这是否意味着有一个函数将被延迟传递,它可以有任意数量的参数,并且返回Int?它可以用于任意数量的参数,或者我们可以为要传递的函数指定特定数量的参数吗?Thnks a lot您可能只是指
def delayed(t:=>Int):Unit
,这意味着t
具有类型Int
,但它是一个按名称调用的参数,这意味着它只在方法体内部使用时得到计算,而不是在调用方法时得到计算。你所做的是不同的-如下所述,t
不是Int
,而是一个函数Int=>Int
,我想你应该在另一个问题中问这个问题。如果您更改问题,以下所有答案都将无效。抱歉@ntlabs。我又问了一个问题。谢谢
scala> delayed(time(8))
In delayed method
16
scala> def delayed(t: =>Int) {
| println("In delayed method")
| var y = t
| println(y)
| }
delayed: (t: => Int)Unit
scala> def time(t:Int) = t*2
time: (t: Int)Int
scala> delayed(time(8))
In delayed method
16
delayed(time)