皮皮网

皮皮网

【监控摄像头源码】【垂直问答源码】【python 实例源码】scala AnyRef源码

时间:2024-12-27 00:58:32 分类:焦点

1.二、Scala基础知识
2.scala manifest和classmanifest的区别
3.Scala的Class、Object、Trait

scala AnyRef源码

二、Scala基础知识

       适合阅读本教程的人员包括初学者和希望扩展Java知识体系的开发者,了解Scala基础知识对深入学习Scala及其在大数据和并行计算领域的监控摄像头源码应用尤为重要。

       学习任务主要涉及Scala的解释器使用、基础语法、函数、条件与循环。

       Scala解释器

       Scala解释器分为交互模式和脚本模式。交互模式允许开发者在命令行中直接运行Scala代码,如在命令行输入“scala”启动环境,然后执行命令输出如“Hello,垂直问答源码 World!”等简单操作。通过按CTRL+C退出交互模式。脚本模式则类似于执行Java程序,需要创建文件并指定目录,如`HelloWorld.scala`,通过命令行执行该文件以运行代码。

       基础语法

       Scala语法规范与Java类似,学习者可参考Java相关规范。变量和常量声明遵循特定格式:常量使用`val`关键字,变量使用`var`。数据类型如`Int`、`String`等均为大写,与Java略有不同。

       数据类型

       Scala中的python 实例源码数据类型均为对象,无Java的原生基本类型。常见数据类型与Java一致,包括Byte、Short、Int、Long、Float、Double、Char、String、Boolean。此外,Scala引入了`Null`、搞笑笔记源码`Nothing`、`Any`、`AnyRef`等特殊类型,用于表示null、所有类的底端、所有类的超类和基类。

       关键字与标识符

       Scala有个关键字,部分与Java重合。标识符以字母或下划线开头,可包含字母、数字或下划线。避免使用特殊字符如`$`,遵循驼峰式命名规则。chrome源码安装

       函数与方法

       Scala中的函数和方法类似,但函数可以作为值赋给变量,方法则不行。函数定义包含参数列表、返回类型和方法体,方法调用遵循Java的规则。函数和方法之间可以相互转换,使用特殊语法实现。

       条件与循环

       条件语句采用`if-else`形式,可省略`else if`和`else`。循环包括`while`、`do...while`和`for`循环,与Java相似。`for`循环具有强大的推导式功能,允许生成和处理集合。

       结束阅读后,请完成课后作业,如有版权问题,请联系邮箱或微信。

scala manifest和classmanifest的区别

       Manifest是scala2.8引入的一个特质,用于编译器在运行时也能获取泛型类型的信息。在JVM上,泛型参数类型T在运行时是被“擦拭”掉的,编译器把T当作Object来对待,所以T的具体信息是无法得到的;为了使得在运行时得到T的信息,scala需要额外通过Manifest来存储T的信息,并作为参数用在方法的运行时上下文。

       def test[T] (x:T, m:Manifest[T]) { ... }

       æœ‰äº†Manifest[T]这个记录T类型信息的参数m,在运行时就可以根据m来更准确的判断T了。但如果每个方法都这么写,让方法的调用者要额外传入m参数,非常不友好,且对方法的设计是一道伤疤。好在scala中有隐式转换、隐式参数的功能,在这个地方可以用隐式参数来减轻调用者的麻烦。

       èŽ·å–class manifests的两种基本方式:

        1 def classOf[T <: Any](implicit m: scala.reflect.Manifest[T]): Class[T] = m.erasure.asInstanceOf[Class[Tï¼½

        通过implicit m: scala.reflect.Manifest[T]声明一个隐式参数,这样scala编译器能在编译时提供T的类型信息了

        2 def classOf[T <: Any : Manifest] : Class[T] = manifest[T].erasure.asInstanceOf[Class[Tï¼½

        其中 T <: Any : Manifest,拆分成两部分来看

        T <: Any

        T 是Any的子类型(即可以是任意基本类型scala.AnyVal 和引用类型 scala.AnyRef)

        T : Manifest 相当于对classOf 方法currying

        隐式增加参数列表如下:(implicit evidence$1: Manifest[T]),

        通过manifest[T] 方法即可获取Manifest实例

        可见形式1 和形式2实质是一样的。

       åº”用:

        1最常见的是获取类型参数的Class,形如someMethod[Type]

        如akka中源码: def actorOf[T <: Actor : Manifest]: ActorRef = actorOf(manifest[T].erasure.asInstanceOf[Class[_ <: Actorï¼½)

        class Worker extends Actor {

        def receive = {

        case Work(start, nrOfElements) =>

        self reply Result(calculatePiFor(start, nrOfElements)) // perform the work

        }

        }

        就可以如此使用了: val workerActorRef = actorOf[Worker]

        2 编程方式创建范型数组

        def evenElems[T: ClassManifest](xs: Vector[T]): Array[T] = {

        val arr = new Array[T]((xs.length + 1) / 2)

        for (i <- 0 until xs.length by 2)

        arr(i / 2) = xs(i)

        arr

        }

        scala> evenElems(Vector("a","b","c"))

        res: Array[java.lang.String] = Array(a, c)

Scala的Class、Object、Trait

       开发环境

       使用ideaIU或ideaIC,通过File-Setting-Plugins搜索并在线安装scala插件,或下载后离线安装。在Project Structure中添加scala-sdk,作为全局库。

       基础

       在scala中,break和continue的实现用于跳出循环,0 until 表示0到9,不含,而0 to 表示0到,含。可以使用Java的类库。

       类Class、Object、Trait

       类class里无static类型,属性和方法必须通过new的对象来调用,即使有main主函数也没用。Object的特点是构造函数和Bean属性,可以定义getter和setter方法。

       实现同个类既有普通方法又有静态方法?

       通过伴生对象可以实现,伴生对象可以访问类的私有成员,且javap BanSheng.class反编译后,伴生对象的apply方法与单例模式相关。

       继承

       Scala中的类继承自Any超类,所有类都是Any的子类,因此定义在Any中的方法可以被任何对象调用。Any有两个子类:AnyVal和AnyRef。AnyVal是值类的父类,包含基本类型,而AnyRef是引用类的基类,相当于Java的Object。

       Scala类与Java类的不同在于它们继承自ScalaObject特质,以提高执行效率。处理边界情况的特殊类型是scala.Null和scala.Nothing。

       Trait特质

       Scala的Trait类似Java的Interface,但不仅定义函数,还可以实现函数体。通过extends关键字继承多个Trait,使用with实现多个Trait。当多个Trait中有相同函数时,子类必须重写该函数。

       案例1和案例2

       详细内容涉及反编译后的代码,需要具体代码示例以展示实现效果。

       本文首发于steem,感谢阅读,转载请注明。微信公众号「padluo」,分享数据科学家的自我修养,既然遇见,不如一起成长。知识星球交流群。