Scala基础教程(五):函数、闭包
2015-12-10 12:30
726 查看
函数是一组一起执行任务的语句。可以将代码放到独立的功能。如何划分你的代码不同功能之间,但在逻辑上,划分通常是让每个函数执行特定的任务。
Scala有函数和方法,我们术语说的方法和函数互换用微小的差别。Scala方法是其中有一个名字,签名,任选一些注释,有的字节码,其中如在Scala中函数是可被分配给一个变量的完整对象类的一部分。换句话说,函数,其被定义为某些对象的一个成员,被称为方法。
函数定义可以出现在在源文件的任何地方,Scala允许嵌套函数的定义,那就是其他函数定义的内部函数定义。需要注意的最重要的一点是,Scala的函数名称可以类似+, ++, ~, &,-, -- , , /, :等字符。
如果保留关闭等号和方法体的方法为隐式声明,抽象的封闭类型是抽象本身。
在这里,返回类型可以是任何有效的scala数据类型,参数列表将是用逗号和参数,返回值类型列表分离变量是可选的。非常类似于Java,一个返回语句可以在函数表达式可用情况下返回一个值。以下是这将增加两个整数并返回的函数:
函数,它不返回任何东西,可以返回这相当于在Java中void,并表示该函数不返回任何单元。Scala中不返回任何东西函数被称为过程。以下是语法
如果函数被对象的一个实例调用使用,那么使用类似于Java点标记如下:
下面是一个例子用来定义,然后调用函数:
让我们编译和运行上面的程序,这将产生以下结果:
Scala函数是Scala编程的核心,这就是为什么Scala被假定为一个函数式编程语言。以下是Scala程序员理解相关Scala函数的一些重要的概念。
闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值。考虑下面的一块使用匿名函数的代码:
val multiplier =
(i:Int)
=> i *
10
在这里,在函数体中使用的唯一变量, i * 0, 为i,其被定义为一个参数的函数。现在,让我们来看另一块代码:
val multiplier =
(i:Int)
=> i *factor
有两个自由变量的乘数:i和factor。其中一个i是一个正式函数参数。因此,它被绑定到一个新的值在乘数每次调用。然而,factor不是一个正式的参数,那么这是什么?让我们增加一行代码:
var factor
= 3
val multiplier =
(i:Int)
=> i *factor
现在,factor具有参考变量在函数之外,但为封闭范围的变量。让我们试试下面的例子:
object
Test {
def main(args:
Array[String])
{
println(
"muliplier(1)value = " + multiplier(1)
)
println(
"muliplier(2)value = " + multiplier(2)
)
}
var factor
= 3
val multiplier =
(i:Int)
=> i * factor
}
让我们编译和运行上面的程序,这将产生以下结果:
C:/>scalac
Test.scala
C:/>scala
Test
muliplier(1) value
= 3
muliplier(2) value
= 6
C:/>
上面的函数引用factor并读取每个时间的当前值。如果函数没有外部引用,那么它就是封闭了自己。无需外部环境是必需的。
考虑下面这个简单的例子,我们给一个字符串类型的 val 变量:
在这里,上面的值类型是从Java的java.lang.String借来的,因为Scala的字符串也是Java字符串。这一点是非常好的,要注意:每 一个Java类可用在Scala中。因此,Scala没有String类并直接利用Java字符串String类。因此,这一章已被写入保持Java String的基础。
在Scala中与在Java中一样,一个字符串是不可变的对象,也就是,这是不能被修改的对象。另一方面,对象是可以修改的,如数组对象,被称为可变对象。由于字符串是非常有用的对象,在本节的其余部分,我们目前最重要了解类java.lang.String的方法定义。
from: http://www.yiibai.com/scala/scala_basic_syntax.html
Scala有函数和方法,我们术语说的方法和函数互换用微小的差别。Scala方法是其中有一个名字,签名,任选一些注释,有的字节码,其中如在Scala中函数是可被分配给一个变量的完整对象类的一部分。换句话说,函数,其被定义为某些对象的一个成员,被称为方法。
函数定义可以出现在在源文件的任何地方,Scala允许嵌套函数的定义,那就是其他函数定义的内部函数定义。需要注意的最重要的一点是,Scala的函数名称可以类似+, ++, ~, &,-, -- , , /, :等字符。
函数声明:
Scala的函数声明有如下形式:def functionName ([list of parameters]) : [return type]
如果保留关闭等号和方法体的方法为隐式声明,抽象的封闭类型是抽象本身。
函数定义:
Scala函数定义有如下形式:def functionName ([list of parameters]) : [return type] = {
function body
return [expr]
}
在这里,返回类型可以是任何有效的scala数据类型,参数列表将是用逗号和参数,返回值类型列表分离变量是可选的。非常类似于Java,一个返回语句可以在函数表达式可用情况下返回一个值。以下是这将增加两个整数并返回的函数:
object add{
def addInt( a:Int, b:Int ) : Int = {
var sum:Int = 0
sum = a + b
return sum
}
}
函数,它不返回任何东西,可以返回这相当于在Java中void,并表示该函数不返回任何单元。Scala中不返回任何东西函数被称为过程。以下是语法
object Hello{
def printMe( ) : Unit = {
println("Hello, Scala!")
}
}
调用函数:
Scala提供了一些语法的变化来调用方法。以下是调用一个方法的标准方法:functionName( list of parameters )
如果函数被对象的一个实例调用使用,那么使用类似于Java点标记如下:
[instance.]functionName( list of parameters )
下面是一个例子用来定义,然后调用函数:
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
}
}
让我们编译和运行上面的程序,这将产生以下结果:
C:/>scalac Test.scala
C:/>scala Test
Returned Value : 12
C:/>
Scala函数是Scala编程的核心,这就是为什么Scala被假定为一个函数式编程语言。以下是Scala程序员理解相关Scala函数的一些重要的概念。
函数按名称调用 | 使用命名参数函数 |
函数使用可变参数 | 递归函数 |
默认参数值 | 高阶函数 |
嵌套函数 | 匿名函数 |
部分应用函数 | 柯里函数 |
闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值。考虑下面的一块使用匿名函数的代码:
val multiplier =
(i:Int)
=> i *
10
在这里,在函数体中使用的唯一变量, i * 0, 为i,其被定义为一个参数的函数。现在,让我们来看另一块代码:
val multiplier =
(i:Int)
=> i *factor
有两个自由变量的乘数:i和factor。其中一个i是一个正式函数参数。因此,它被绑定到一个新的值在乘数每次调用。然而,factor不是一个正式的参数,那么这是什么?让我们增加一行代码:
var factor
= 3
val multiplier =
(i:Int)
=> i *factor
现在,factor具有参考变量在函数之外,但为封闭范围的变量。让我们试试下面的例子:
object
Test {
def main(args:
Array[String])
{
println(
"muliplier(1)value = " + multiplier(1)
)
println(
"muliplier(2)value = " + multiplier(2)
)
}
var factor
= 3
val multiplier =
(i:Int)
=> i * factor
}
让我们编译和运行上面的程序,这将产生以下结果:
C:/>scalac
Test.scala
C:/>scala
Test
muliplier(1) value
= 3
muliplier(2) value
= 6
C:/>
上面的函数引用factor并读取每个时间的当前值。如果函数没有外部引用,那么它就是封闭了自己。无需外部环境是必需的。
考虑下面这个简单的例子,我们给一个字符串类型的 val 变量:
object Test {
val greeting: String = "Hello, world!"
def main(args: Array[String]) {
println( greeting )
}
}
在这里,上面的值类型是从Java的java.lang.String借来的,因为Scala的字符串也是Java字符串。这一点是非常好的,要注意:每 一个Java类可用在Scala中。因此,Scala没有String类并直接利用Java字符串String类。因此,这一章已被写入保持Java String的基础。
在Scala中与在Java中一样,一个字符串是不可变的对象,也就是,这是不能被修改的对象。另一方面,对象是可以修改的,如数组对象,被称为可变对象。由于字符串是非常有用的对象,在本节的其余部分,我们目前最重要了解类java.lang.String的方法定义。
from: http://www.yiibai.com/scala/scala_basic_syntax.html
相关文章推荐
- 深入理解PHP之匿名函数
- Windows下Scala环境搭建
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Ruby中使用Block、Proc、lambda实现闭包
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- LUA中的闭包(closure)浅析
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua中的闭包学习笔记
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数