2011-09-13 21 views
3

目前采取目前正使用Scala的,我以前从未使用过的一类,所以,语法和它本身是新的。斯卡拉不变的变量和打印

我工作的一个简单的除法功能,但我遇到了一些错误。

首先,我使用VAR子= M吧?在我的代码中,我只是想做m = m-n,但是你不能改变这个变量,我不确定最好的选择是什么。 然后我唯一的另一个问题是编译器呵斥我为我打印行..

<console>:14: error: reassignment to val 
     m = m-n 

///////////////////////// ////////////////////////////////////////////////// ////

<console>:16: error: type mismatch; 
found : Unit 
required: Int 
     println(x) 

/////////////////// ////////////////////////////////////////

def div(m: Int, n: Int): Int = { 
    var x = 0 
    var sub = m 
    if (n > m) 
     print("Can't perform that.") 

    while (sub >= n) { 
     x+=1 
     sub = sub-n 
    } 
println(x) 
} 

回答

6

问题是实际上你的回报价值。你声明div返回一个Int,编译器(在你的情况下)假设你的最后一个语句是你的返回值。由于println返回Unit(这是一个void函数),编译器很困惑。

您可以明确地在你的函数说return x任何地方返回一个值,或者你可以把x作为函数的最后一条语句(或在函数执行的一个特定的路径)。例如:

def what(b:Boolean):Int = { 
    if(b) 1 
    else 0 
} 

(斯卡拉将让我写def what(b:Boolean) = if(b) 1 else 0,这将是完全一样的功能之上,但是这是除了点)

为了方便起见,这里是与你的函数修改我描述:

def div(m: Int, n: Int): Int = { 
    var x = 0 
    var sub = m 
    if (n > m) 
    print("Can't perform that.") 

    while (sub >= n) { 
    x+=1 
    sub = sub-n 
    } 
    println(x) 
    x // <--- return value 
} 
+0

它总是以最后一条语句作为回报吗? 另外,我使用var sub = m方法吗?它只是看起来像添加不必要的废话,但你显然不能只是做m = mn –

+1

@johnredyns是的,sub = m是正确的,在斯卡拉函数/方法的参数总是一个val,你不能做重新分配他们。在大多数情况下,Scala使用函数方法(例如递归)来解决你描述的问题,所以恕我直言,不能重新分配参数。 –

3

为了完整起见,把更多的惯用递归定义在这里:

def div(m: Int, n: Int): Int = { 
    @annotation.tailrec 
    def loop(count: Int, sub: Int): Int = 
    if (sub < n) count 
    else loop(count + 1, sub - n) 

    loop(0, m) 
}