标签:
scala除了方法外还支持函数,方法是对对象进行操作,而函数不是。(类型与java中静态方法,妈蛋,好歹也写过C和C++这还理解不深刻了)。除此之外,写法一样。
object add{
//指定返回值类型,返回的值不需要使用return指定,会取最后一个表达式的值。
def abs(x:Double):Double = if(x>=0) x else -x
//函数体需要多个表达式完成,就用代码块咯,代码块特性看代码块知识点咯。算了,跟你提示一下,会取最后一个表达式的值。
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0;
sum = a + b;
sum;
}
//也可以不指定返回值类型,scala编辑器可以通过=号右侧的表达式类型推断出返回类型。
def remoInt( a:Int, b:Int ) = {
var sum:Int = 0;
sum = a - b;
sum;
}
//这个就是简化版,就是函数是无参,可以不写()号,返回值类型不指定,scala推断出来,表达式就一句,就不用代码块了。
def remoInt=22;// def remoInt() : Int = {22}
//递归函数,不指明返回类型会无法通过校验,scala编译器无法校验n*fac(n-1)的类型时Int,我想不明白。
def fac(n:Int):Int = {
if(n<=0) 1 else n*fac(n-1)
}
// def fac(n:Int)= {
// if(n<=0) 1 else n*fac(n-1)
// }
//这里返回值为(),因为你打印值,这样相当于返回的unit类型,那不就是()值吗。傻逼。
def foreacher(n:Int)= {
for(sum <- 0 to n)
{
println(sum);
}
}
def main(args: Array[String]) {
println(add.foreacher(3)+"---");
}
}
def decorete(str:String,left:String="[",right:String="]")=left+str+right;
我们可以看到这个函数有两个参数left和right带有默认值"["和"]"。
object add{
def decorete(left:String="[",str:String,right:String="]")=left+str+right;
def demo(str:String,left:String="[",right:String="]")=left+str+right;
def main(args: Array[String]) {
// println(add.decorete("nihao"));//检查不通过,原因就是参数nihao匹配的是left字符串,而str字符串没有传入值。
println(add.decorete("nihao","baby"));//nihaobaby]
println(add.demo("nihao"));//[nihao]
//原因就不需要解释,看到这三个结果就明白了。
//提供参数的时候指定参数名。
println(add.decorete(str="baby"));//[baby] 没指定的就默认值嘛,不要纠结,小韭菜们。
println(add.decorete(left="[]",str="baby"));//[]baby]
//混合也是可以的,不要纠结书本,就你去掉指定的参数,然后看你传入没指定参数的值和方法中没有获得传入值且没有默认值得参数位置匹配吧。匹配就通过,没有就无法通过报错。
println(add.decorete(left="[]","baby"));//[]baby] 这个我们很明显baby是作为方法参数中去掉指明参数后的第一个参数名的值。
println(add.decorete(left="[]","baby","***"));//[]baby*** 这下明白了把,再不明白,你可以去工地搬砖了。
}
}
变长参数等我心情好了,就总结。
标签:
原文地址:http://www.cnblogs.com/intsmaze/p/5744766.html