1.二、Scala基础知识
2.scala manifeståclassmanifestçåºå«
3.Scala的Class、Object、Trait
二、Scala基础知识
适合阅读本教程的人员包括初学者和希望扩展Java知识体系的开发者,了解Scala基础知识对深入学习Scala及其在大数据和并行计算领域的域名报价单页源码应用尤为重要。 学习任务主要涉及Scala的解释器使用、基础语法、函数、条件与循环。Scala解释器
Scala解释器分为交互模式和脚本模式。交互模式允许开发者在命令行中直接运行Scala代码,如在命令行输入“scala”启动环境,然后执行命令输出如“Hello,Robot源码 World!”等简单操作。通过按CTRL+C退出交互模式。脚本模式则类似于执行Java程序,需要创建文件并指定目录,如`HelloWorld.scala`,通过命令行执行该文件以运行代码。基础语法
Scala语法规范与Java类似,学习者可参考Java相关规范。变量和常量声明遵循特定格式:常量使用`val`关键字,变量使用`var`。数据类型如`Int`、`String`等均为大写,与Java略有不同。数据类型
Scala中的ctk源码数据类型均为对象,无Java的原生基本类型。常见数据类型与Java一致,包括Byte、Short、Int、Long、Float、Double、Char、String、Boolean。此外,Scala引入了`Null`、轮训源码`Nothing`、`Any`、`AnyRef`等特殊类型,用于表示null、所有类的底端、所有类的超类和基类。关键字与标识符
Scala有个关键字,部分与Java重合。标识符以字母或下划线开头,可包含字母、数字或下划线。避免使用特殊字符如`$`,遵循驼峰式命名规则。yioop源码函数与方法
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」,分享数据科学家的自我修养,既然遇见,不如一起成长。知识星球交流群。