Skip to content

Commit eec8770

Browse files
committed
函数闭包,修改类名
1 parent 720b5a1 commit eec8770

5 files changed

Lines changed: 72 additions & 14 deletions

File tree

src/cn/edu/jxnu/scala/basic/FunctionObjects.scala renamed to src/cn/edu/jxnu/scala/basic/FunctionBasic.scala

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package cn.edu.jxnu.scala.basic
66
* @author 梦境迷离
77
* @time 2018-12-17
88
*/
9-
object FunctionObjects {
9+
object FunctionBasic {
1010

1111
}
1212

@@ -139,6 +139,55 @@ object Function extends App {
139139
*
140140
* 闭包
141141
*/
142-
object Function extends App {
142+
object Function2 extends App {
143+
144+
val m = 1;
145+
//引用外部变量
146+
// 因为闭包实际捕获的是变量本身,所以m被修改后会体现到fun中,即闭包里面仍可以观察到闭包外面的m被修改后的值
147+
//反过来闭包中对变量的修改,在闭包外也能看到
148+
val fun = (x: Int) => x + m
149+
150+
val nums = List(1, 2, 3, 4, 5, 5, 3)
151+
152+
var sum = 0
153+
nums.foreach(sum += _)
154+
155+
println(sum)
156+
157+
// (x: Int) => x + m 是一个闭包,每次m都是新传入的值
158+
def sum(m: Int) = (x: Int) => x + m
159+
160+
// (x: Int) => x + m 是一个闭包,每次m都是固定值
161+
def sum2(x: Int) = (x: Int) => x + m // 即使方法已经调用并返回了,但是scala编译器会重新组织安排,让被捕获的参数在堆上继续存活
162+
//无论是val var 或者是参数
163+
164+
}
165+
166+
/**
167+
* 其他函数特性
168+
*
169+
* 重复参数,带名参数,缺省参数
170+
*/
171+
object Function3 extends App {
172+
173+
//重复参数
174+
def prt(args: String*) = for (arg <- args) println(arg)
175+
176+
prt("hello", "world")
177+
178+
val arr = Array("hello", "world")
179+
// prt(arr)//编译报错
180+
prt(arr: _*) //OK,告诉编译器将arr的每个元素作为参数传进去,而不是将arr作为一个整体
181+
182+
//带名字参数,字面量/匿名函数不能使用带名参数
183+
val su = (x: Int, y: Int) => x + y
184+
// val suu = su(y = 1, x = 2)
185+
186+
def sum(x: Int, y: Int) = x + y
187+
188+
val s = sum(y = 1, x = 2) //参数顺序不再固定
189+
190+
//缺省函数,y有默认值1
191+
def sum2(x: Int, y: Int = 1) = x + y
143192

144193
}

src/cn/edu/jxnu/scala/basic/IOExamples.scala renamed to src/cn/edu/jxnu/scala/basic/IOBasic.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import scala.io.Source
66
* 从文件读取行,文件写入使用Java IO
77
*
88
* 从命令行运行不用加包名
9-
* scala IOExamples.scala IOExamples.scala 后面一个是参数
9+
* scala IOBasic.scala IOBasic.scala 后面一个是参数
1010
*/
11-
object IOExamples {
11+
object IOBasic {
1212

1313
val file = "D:\\git_project\\Java-Learning-Summary\\src\\cn\\edu\\jxnu\\scala\\basic\\IOExamples.scala"
1414
val liness = Source.fromFile(file).getLines().toList

src/cn/edu/jxnu/scala/basic/LoopExamples.scala renamed to src/cn/edu/jxnu/scala/basic/LoopBasic.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import scala.util.control.Breaks._
1313
* 5. Scala的for是for表达式,更接近函数式
1414
* 6. 纯函数式for:list.foreach(println) @see loopTest.scala
1515
*/
16-
object LoopExamples {
16+
object LoopBasic {
1717
//这种是独立对象
1818

1919
//普通遍历整形数组@see Test4.scala
@@ -102,4 +102,13 @@ object LoopExamples {
102102
next(0)
103103
}
104104

105+
//Scala赋值语句返回的不是赋值的那个值而是()
106+
var line = ""
107+
while ((line = readLine()) != "") {
108+
//这样永远是()!=“”
109+
println(line)
110+
}
111+
112+
//需要在外部赋值初始化,并在while里面进行更新
113+
//因为while没有返回值,并且使用了var变量,实际上函数式语言并不推荐。可以使用尾递归替代
105114
}

src/cn/edu/jxnu/scala/basic/ObjectsAndClasses.scala renamed to src/cn/edu/jxnu/scala/basic/ObjectBasic.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ package cn.edu.jxnu.scala.basic
66
* @author 梦境迷离
77
* @time 2018-12-14
88
*/
9-
class CompanionClass {
9+
class ObjectBasic {
1010

1111

1212
private val str1 = "hello"
1313

1414
def print(): Unit = {
15-
println(CompanionClass.str2)
15+
println(ObjectBasic.str2)
1616
}
1717

1818
// 源文件名称可以和类名不同
@@ -23,15 +23,15 @@ class CompanionClass {
2323
*/
2424
//伴生对象与伴生类同名,同一源文件中
2525
//注意单例对象是一等的,是特殊的class
26-
object CompanionClass extends App {
26+
object ObjectBasic extends App {
2727
//启动Scala程序
2828
//1.混入App,默认就可以执行里面的语句
2929
//2.增加自己的main方法
3030
//3.混入特质并重写main
3131
//继承/混入APP特质
3232
//单例可以混入特质
3333
private val str2 = "world"
34-
val companionClass = new CompanionClass() //new只能实例化类
34+
val companionClass = new ObjectBasic() //new只能实例化类
3535
println(companionClass.str1) //单例对象类似Java的static方法调用
3636
companionClass.print() //可以互相访问对方的私有属性,方法
3737

src/cn/edu/jxnu/scala/basic/basicAndInfo.scala renamed to src/cn/edu/jxnu/scala/basic/ScalaBasic.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ package object basic {
125125
* 如果没有指定访问修饰符符,默认情况下,Scala 对象的访问级别都是 public。
126126
* Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类不能访问被嵌套类的私有成员。(内部可以访问外层的私有,不如内部/层就没意义了。。。)
127127
*
128-
* @see ObjectsAndClasses.scala->OutPrivateClass.scala | TestInnerPrivateClass.scala
128+
* @see ObjectBasic.scala->OutPrivateClass.scala | TestInnerPrivateClass.scala
129129
**/
130130

131131
/** 在 scala 中,对保护(Protected)成员的访问比 java 更严格一些。因为它只允许保护成员在定义了该成员的的类的子类中被访问。
@@ -194,15 +194,15 @@ package object basic {
194194
**/
195195
/**
196196
* Scala的main方法执行 @see SingletonObject.scala、Test2.scala
197-
* Scala的for循环中断和List的交并差 @see LoopExamples.scala
197+
* Scala的for循环中断和List的交并差 @see LoopBasic.scala
198198
* Scala的数组 @see Test3.scala、Test4.scala
199199
* Scala中的方法调用 操作符表示法 @see Test4.scala
200200
* Scala的列表 @see Test6.scala
201201
* Scala的元组 @see Test7.scala
202202
* Scala的集合和映射(map) @see Test8.scala
203203
* Scala的可变集合主要用于命令式传统编程(当Java用),不可变主要用于函数式编程,推荐使用不可变,减少副作用,也更加安全 @see immutable.png、mutable.png
204-
* Scala从文件读取 @see IOExamples.scala、Test10.scala、Test11.scala
205-
* Scala 面向对象的类、单例对象、构造函数、序列化、注解、重写、重载、函数字面量等 @see ObjectsAndClasses.scala FunctionObjects.scala Function.scala
204+
* Scala从文件读取 @see IOBasic.scala、Test10.scala、Test11.scala
205+
* Scala 面向对象的类、单例对象、构造函数、序列化、注解、重写、重载、函数字面量等 @see ObjectBasic.scala FunctionObjects.scala Function.scala
206206
* Scala基础语法图解 @see Scala语法图解.png (已经取得作者本人同意)
207207
**/
208208

@@ -263,7 +263,7 @@ object Test3 extends App {
263263
arr.foreach(println)
264264
}
265265

266-
//循环中断@see LoopExamples.scala
266+
//循环中断@see LoopBasic.scala
267267
object Test4 extends App {
268268

269269
for (i <- 0 to 2) //to包含了右边界 to实际是(0).to(2)的缩写,to返回一种包含了0、1、2的序列。对于单参数方法的调用时 () . 可以被省略

0 commit comments

Comments
 (0)