scala 初探(二)
来源:互联网 发布:淘宝三了个七什么意思 编辑:程序博客网 时间:2024/05/10 15:55
一般地 scala val对应于C++ const
Scala有一些 比较灵活的使用方法
如所谓 前缀方法及后缀方法
实际就是 方法 没有参数及只有一个参数 当这种情况下
可以将该方法使用 前缀或后缀的形式进行调用。
该类后3种方法的定义中使用了前后缀 运算符进行定义
由于scala中可以将可调用对象最为参数进行传入,当然 将函数体本身进行传入也是支持的
因为函数体本身可以看成一个 没有函数参数的可调用对象。
这种调用方式被简化 使得如下的形式是可以运行的(直接使用函数体作为参数输入)
下面是第二个例子
通过上面两个例子主要要进行展示的是scala在初始化类时 可以灵活地使用
body进行初始化 相当于对于所要实现的功能的“装填”
一般其它语言是不使用这种形式进行初始化的
一般当如Java要实现类似功能时 一般使用的是继承方式
个人认为 这个语言给予此种功能的目的在于 进一步利用将函数作为传递对象(Higher-order Functions)
的优点 如 Scala中的Future对象一般的构造就可以是一个可执行的函数体
将功能进行封装来传递 这是一种非常类似于脚本语言的思想。
Java中一般实现单继承 故当要实现MixIn这种混合继承情况 定义一个MixIn类
就必不可少 在Scala中实现了以extends... with ...的继承 这作为混成类的继承方式
给出了另一个解决方案 下面是一个例子
Scala 如同Python支持闭包(Nested Methods)定义与使用的方法也与Python类似 不具体给出例子。
Scala 支持 柯里化(curry) 表现为支持类似偏函数的函数输出, 这在Python中表现为functools
中的partial固定部分参数(C++ functional bind) 返回新的函数对象
下面是一个例子
从上面的例子中可以看到使用Scala写递归(reduce) 函数的易实现。
回顾一下机器学习的基本知识会发现
其在机器学习中也是有实现 意义的 如 AdaBoost提升算法
通过相同的迭代形式 更新样本权重 将新权重返回改的拟合模型
作为下一步进行训练的输入 就可以利用上面的递归形式。
Scala 函数支持模式匹配(pattern match) 这个特点在Scala 初探(一)中
已经提到了 这里还要说明的是 在使用模式匹配时 可以规定返回不同的类型
下面是一个简单的例子
Scala有一些 比较灵活的使用方法
如所谓 前缀方法及后缀方法
实际就是 方法 没有参数及只有一个参数 当这种情况下
可以将该方法使用 前缀或后缀的形式进行调用。
一个简单的例子如下:
package scalaStudy/** * Created by admin on 2017/4/18. */case class MyBool(x: Boolean){ def and(that: MyBool): MyBool = { if (x) that else this } def or(that:MyBool): MyBool = if(x) this else that def negate: MyBool = MyBool(!x) def not(x: MyBool) = x.negate def xor(x: MyBool, y: MyBool) = (x or y) and not(x and y)}object MainCall { def main(args: Array[String]): Unit ={ println("call main") var boolInstance = new MyBool(true) println(boolInstance negate); println(boolInstance xor(new MyBool(true), new MyBool(false))) }}
该类后3种方法的定义中使用了前后缀 运算符进行定义
由于scala中可以将可调用对象最为参数进行传入,当然 将函数体本身进行传入也是支持的
因为函数体本身可以看成一个 没有函数参数的可调用对象。
这种调用方式被简化 使得如下的形式是可以运行的(直接使用函数体作为参数输入)
object TargetTest1 extends App{ def whileLoop(cond: => Boolean)(body: => Unit): Unit ={ if(cond){ body whileLoop(cond)(body) } } var i = 10 whileLoop(i > 0){ println(i) i -= 1 } }
下面是第二个例子
object TargetTest2 extends App{ def loop(body: => Unit): LoopUnlessCond = new LoopUnlessCond(body) protected class LoopUnlessCond(body: => Unit){ def unless(cond: => Boolean): Unit ={ body if(!cond) unless(cond) } } var i = 10 loop{ println("i = " + i); i -= 1; }.unless(i == 0)}
通过上面两个例子主要要进行展示的是scala在初始化类时 可以灵活地使用
body进行初始化 相当于对于所要实现的功能的“装填”
一般其它语言是不使用这种形式进行初始化的
一般当如Java要实现类似功能时 一般使用的是继承方式
个人认为 这个语言给予此种功能的目的在于 进一步利用将函数作为传递对象(Higher-order Functions)
的优点 如 Scala中的Future对象一般的构造就可以是一个可执行的函数体
将功能进行封装来传递 这是一种非常类似于脚本语言的思想。
Java中一般实现单继承 故当要实现MixIn这种混合继承情况 定义一个MixIn类
就必不可少 在Scala中实现了以extends... with ...的继承 这作为混成类的继承方式
给出了另一个解决方案 下面是一个例子
abstract class AbsIterator { type T def hasNext: Boolean def next: T}trait RichIterator extends AbsIterator{ def foreach(f: T=> Unit): Unit ={ while(hasNext){ f(next) } }}class StringIterator(s: String) extends AbsIterator{ type T = Char private var i = 0 override def hasNext = i < s.length override def next = {val ch = s.charAt(i);i += 1; ch}}object StringIteratorTest{ def main(args: Array[String]): Unit ={ //class Iter extends StringIterator(args(0)) with RichIterator class Iter extends StringIterator("jack") with RichIterator val iter = new Iter iter foreach println }}
Scala 如同Python支持闭包(Nested Methods)定义与使用的方法也与Python类似 不具体给出例子。
Scala 支持 柯里化(curry) 表现为支持类似偏函数的函数输出, 这在Python中表现为functools
中的partial固定部分参数(C++ functional bind) 返回新的函数对象
下面是一个例子
object CurryTest extends App{ def filter(xs: List[Int], p: Int => Boolean): List[Int] = { if (xs.isEmpty) xs else if (p(xs.head)) xs.head :: filter(xs.tail, p) else filter(xs.tail, p) } def modN(n: Int)(x: Int)= ((x % n) == 0) val nums = List(1,2,3,4,5,6,7,8) println(filter(nums, modN(2))) println(filter(nums, modN(3)))}
从上面的例子中可以看到使用Scala写递归(reduce) 函数的易实现。
回顾一下机器学习的基本知识会发现
其在机器学习中也是有实现 意义的 如 AdaBoost提升算法
通过相同的迭代形式 更新样本权重 将新权重返回改的拟合模型
作为下一步进行训练的输入 就可以利用上面的递归形式。
Scala 函数支持模式匹配(pattern match) 这个特点在Scala 初探(一)中
已经提到了 这里还要说明的是 在使用模式匹配时 可以规定返回不同的类型
下面是一个简单的例子
object MatchTest2 extends App { def matchTest(x: Any): Any = x match { case 1 => "one" case "two" => 2 case y: Int => "scala.Int" } println(matchTest("two")) println(matchTest(1)) println(matchTest(10))}
0 0
- Scala初探(二)
- scala 初探(二)
- scala初探(一)
- Scala初探(三)
- scala 初探(一)
- scala初探
- scala学习(二)
- scala学习(二)
- Scala练习(二)
- Scala集合(二)
- scala笔记(二)
- Scala总结(二)
- Scala集合(二)
- scala(二)
- Scala Trait(二)
- Hibernate初探(二)
- COM初探(二)
- tolua++初探(二)
- yii2.0文件如何在php命令行中运行
- Notification(通知栏通知)
- IPython下执行shell命令-魔力函数(alias store rehash)- 千月的python linux 系统管理指南学习笔记(6)
- 360如何用QConf搞定2W+服务器的配置管理
- 【深入Java虚拟机】之一:Java内存区域与内存溢出
- scala 初探(二)
- 集训队测试总结合集
- Wireshark入门教程
- 面试感悟---一名3年工作经验的程序员应该具备的技能(转载)
- java开发,大小写的坑,你可曾遇到?
- 使用git出现的问题
- java扑克牌小程序
- 24位BMP位图转换成ASCII码字符图
- js实现全选或全不选,类似email的效果