Scala 方法与函数
Scala 有方法与函数,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法。
Scala 中的方法跟 Java 的类似,方法是组成类的一部分。
Scala 中的函数则是一个完整的对象,Scala 中的函数其实就是继承了 Trait 的类的对象。
Scala 中使用 val 语句可以定义函数,def 语句定义方法。
class Test{ def m(x: Int) = x + 3 val f = (x: Int) => x + 3 }
注意:有些翻译上函数(function)与方法(method)是没有区别的。
方法声明
Scala 方法声明格式如下:
def functionName ([参数列表]) : [return type]
如果你不写等于号和方法主体,那么方法会被隐式声明为抽象(abstract),包含它的类型于是也是一个抽象类型。
方法定义
方法定义由一个 def 关键字开始,紧接着是可选的参数列表,一个冒号 : 和方法的返回类型,一个等于号 = ,最后是方法的主体。
Scala 方法定义格式如下:
def functionName ([参数列表]) : [return type] = { function body return [expr] }
以上代码中 return type 可以是任意合法的 Scala 数据类型。参数列表中的参数可以使用逗号分隔。
以下方法的功能是将两个传入的参数相加并求和:
实例
object add{
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
如果方法没有返回值,可以返回为 Unit,这个类似于 Java 的 void, 实例如下:
实例
object Hello{
def printMe( ) : Unit = {
println("Hello, Scala!")
}
}
def printMe( ) : Unit = {
println("Hello, Scala!")
}
}
方法调用
Scala 提供了多种不同的方法调用方式:
以下是调用方法的标准格式:
functionName( 参数列表 )
如果方法使用了实例的对象来调用,我们可以使用类似java的格式 (使用 . 号):
[instance.]functionName( 参数列表 )
以上实例演示了定义与调用方法的实例:
实例
object Test {
def main(args: Array[String]) {
println( "Returned Value : " + addInt(5,7) );
}
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
def main(args: Array[String]) {
println( "Returned Value : " + addInt(5,7) );
}
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
执行以上代码,输出结果为:
$ scalac Test.scala $ scala Test Returned Value : 12
Scala 也是一种函数式语言,所以函数是 Scala 语言的核心。以下一些函数概念有助于我们更好的理解 Scala 编程:
函数概念解析接案例 | ||
---|---|---|
函数传名调用(Call-by-Name) | 指定函数参数名 | |
函数 - 可变参数 | 递归函数 | |
默认参数值 | 高阶函数 | |
内嵌函数 | 匿名函数 | |
偏应用函数 | 函数柯里化(Function Currying) |
tianqixin
429***967@qq.com
参考地址
方法和函数的区别
1、函数可作为一个参数传入到方法中,而方法不行。
运行结果:
2、在Scala中无法直接操作方法,如果要操作方法,必须先将其转换成函数。有两种方法可以将方法转换成函数:
在方法名称m后面紧跟一个空格和下划线告诉编译器将方法m转换成函数,而不是要调用这个方法。 也可以显示地告诉编译器需要将方法转换成函数:
通常情况下编译器会自动将方法转换成函数,例如在一个应该传入函数参数的地方传入了一个方法,编译器会自动将传入的方法转换成函数。
输出结果为:
3、函数必须要有参数列表,而方法可以没有参数列表
4、在函数出现的地方我们可以提供一个方法
在需要函数的地方,如果传递一个方法,会自动进行ETA展开(把方法转换为函数)
如果我们直接把一个方法赋值给变量会报错。如果我们指定变量的类型就是函数,那么就可以通过编译,如下:
当然我们也可以强制把一个方法转换给函数,这就用到了 scala 中的部分应用函数:
tianqixin
429***967@qq.com
参考地址
tianqixin
429***967@qq.com
参考地址
scala method 和 function 的区别
英文原文:
A Function Type is (roughly) a type of the form (T1, ..., Tn) => U, which is a shorthand for the trait
FunctionN
in the standard library. Anonymous Functions and Method Values have function types, and function types can be used as part of value, variable and function declarations and definitions. In fact, it can be part of a method type.A Method Type is a non-value type. That means there is no value - no object, no instance - with a method type. As mentioned above, a Method Value actually has a Function Type. A method type is a
def
declaration - everything about adef
except its body.例子:
看到没,方法定义和函数定义是不是在scala的解析器signature上就有显示了,def m1(x: Int) = x+3就是一个简单的method的定义。signature中m1: (x: Int)Int 表示method m1有一个参数Int型参数x,返回值是Int型。
val f1 = (x: Int) => x+3则是function的定义,解析器的signature中f1: Int => Int = <function1>表示function f1的method体接受一个Int型的参数,输出结果的类型是Int型。
从上面的例子,得出一个总结:
方法是一个以def开头的带有参数列表(可以无参数列表)的一个逻辑操作块,这正如object或者class中的成员方法一样。
函数是一个赋值给一个变量(或者常量)的匿名方法(带或者不带参数列表),并且通过=>转换符号跟上逻辑代码块的一个表达式。=>转换符号后面的逻辑代码块的写法与method的body部分相同。
tianqixin
429***967@qq.com
参考地址
April.zhang
tes***123.com
方法有返回值,后面加 =:
方法没有返回值,不需要等号:
test1 方法与下面方法等效:
方法如果没有参数可以写成:
April.zhang
tes***123.com