`
alanwu
  • 浏览: 200855 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

十二步学会Scala-2

阅读更多

在上一篇《十二步学会Scala-1 》介绍了Scala的变量定义和方法定义,

这一篇将介绍循环和数组

 

 

第五步:运行脚本

Scala是一个动态性很强的语言,所以它也像Ruby那样,能够写脚本运行。

新建一个hello.scala的文本文件,

hello.scala 写道
println("Hello, world, from a script!")

 

打开命令行,并到达hello.scala所在的目录,

cmd 写道
D:\>scala hello.scala
Hello, world, from a script!

D:\>

 

可以看到很简单,就运行了这个脚本。

 

 

第六步: 循环用while, 判断用if

Scala中使用while和java差不多。

写个把输入的参数字符逐个打印出来的小脚本,printargs.scala

 

printargs.scala 写道
var i = 0
while (i < args.length) {
println(args(i))
i += 1
}

 

这段脚本会把传入的参数逐个打印出来。

while循环体外定义一个可变的变量i,在循环体内每次加一,直到传入的参数全部打印完毕。

cmd 写道
D:\>scala printargs.scala Scala is fun
Scala
is
fun

D:\>

 

注意,Scala中不能用i++或++i

 

if在第一篇的max方法中演示过了,不再重复。

 

 

第七步:用foreach和for进行迭代

上面介绍了用while做循环,用过ruby或者喜欢java5新特性的人可能会说,hey,做个循环怎么这么丑?

ruby,java5有foreach,Scala当然也有!

 

接着上面的需求,用foreach实现把传入的参数打印出来。

建个文本文件,叫pa.scala,里面写上

pa.scala 写道
args.foreach(arg => println(arg))

 

运行pa.scala你会看到

cmd 写道
D:\>scala pa.scala Scala is easy
Scala
is
easy

D:\>

 

arg是迭代变量,不需要手工赋值,编译器会把传递给它。

同时编译器会认出arg的类型,所以这里不需要定义类型。

但我觉得如果类型不是一目了然的情况下,最好是定义一下类型,可以使阅读代码的人很轻松。

 

把arg定义上类型

pa.scala 写道
args.foreach((arg: String) => println(arg))

 注意当给变量定义类型的时候,必须要加括号!

 

这里传给foreach的实际上就是一个匿名方法!

匿名方法的定义是这样的:

 

匿名方法

 

方法参数 => 方法体

 

我们这个传入的匿名方法就是: (arg: String) => println(arg)

 

很懒的程序员会发现,这里arg好像没什么必要,唯一参数传给唯一的方法体。

在java这样的想法可能是空幻想,但Scala帮你实现了!

我们可以省略成:

pa.scala 写道
args.foreach(println)

 就这么少!

 

Scala还有一个for迭代,可以做更多的事情,但这里只介绍一下它的简单用法。

在ruby中实现上面的打印参数:

ruby 写道
for arg in ARGV # Remember, this is Ruby, not Scala
puts arg
end

 

用Scala的for来实现

scala 写道
for (arg <- args)
println(arg)

 感觉怎么样?这里左箭头<-可以读成in。

 

在Scala,如果一句话是一行,可以省略分号;如果多个语句放在一行,用分号隔开。

 

 

 

第八步: 数组

数组是定义数据类型很重要很基础的容器。

在Scala里如何使用数组呢?

 

这次我们的参数由程序定义,并把他们打印出来。

建个文本文件,叫paramswithvalues.scala

paramswithvalues.scala 写道
val greetStrings = new Array[String](3)

greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world!\n"

for (i <- 0 to 2)
print(greetStrings(i))

 

这里出现了很多Scala的新式武器!

1. 定义数组类型

val greetStrings = new Array[String](3)

 val已经介绍过了,表示greetStrings不能再被赋值。

这里Array[String]表示类型,可以读成字符串的数组,它是一个类型,也就是类,所以可以用new去实例化。

括号3表示数组容量是3

 

2. 数组元素赋值

greetStrings(0) = "Hello"

 虽然greetStrings是不可更改的,但数字元素可以。

Scala用小括号代替java的中括号,可能很多java工程师会说:呵,发明新轮子。

其实Scala是被冤枉的。

 

Scala里所以东西都是对象,数组也不例外。数组赋值其实也是一个方法完成的。

上面的代码会被编译器转换成两个参数的方法:

greetStrings.update(0, "Hello")

 当然你也直接这样写上面的赋值:

greetStrings.update(0, "Hello")
greetStrings.update(1, ", ")
greetStrings.update(2, "world!\n")
 

3. 数组元素读取

在for循环体里面有

print(greetStrings(i))

 为什么Scala不用中括号呢?是因为Scala有一套通用规则,会把小括号转换成apply。

所以编译器会得到这样的代码:

print(greetStrings.apply(i))

 

很魔术?其实只要知道Scala的一些通用规则,很多符号就变得非常简单易懂了。

 

如果不使用符号,我们的代码同样可以完成:

val greetStrings = new Array[String](3)

greetStrings.update(0, "Hello")
greetStrings.update(1, ", ")
greetStrings.update(2, "world!\n")

for (i <- 0.to(2))
  print(greetStrings.apply(i))
 

 

这里for循环用了0 to 2,很容易理解,就是从0到2,默认步进1.

当方法参数只有一个的时候,可以不写括号和点,

所以第一循环是这样写就够了:

for (i <- 0 to 2)

 to是0的一个方法,

for (i <- 0.to(2)) 

 

数组就基本介绍到这里。

 

接下来一篇将介绍集合类。

 

 

未完待续

4
0
分享到:
评论
1 楼 WesTwardblue 2016-04-07  
好东西,给楼主赞一个

相关推荐

    快学Scala-课后习题答案-源码

    2. **面向对象编程**: Scala是面向对象的语言,支持类、对象、继承、封装和多态性。理解如何创建类、对象,以及如何使用特质(trait)来实现多重继承,是学习Scala OOP的基础。 3. **函数式编程**: Scala也支持函数...

    scala-sorts:scala中的排序算法

    通过阅读和理解这些代码,你可以更好地掌握各种排序算法的原理,并学会在 Scala 中高效地使用它们。 学习和比较这些排序算法对于提升编程能力、理解算法性能至关重要。在实际应用中,应根据数据特性和性能需求选择...

    scala-course-2021-spring

    **Scala课程2021春季版** 这门课程聚焦于使用Scala 3进行软件开发,一个强大而富有表现力的...通过这门课程,你将不仅学会Scala 3编程,还能掌握高效构建和管理Scala项目的工具,为你的开发生涯增添一份宝贵的技能。

    scalaz-scala-exchange

    "如何学会停止担心并爱上单子"这部分描述可能是指学习Scalaz过程中对单子这一抽象概念的理解和应用。 首先,我们需要理解什么是单子(Monad)。在计算机科学中,单子是具有绑定操作(flatMap或&gt;&gt;=)和单位元...

    scala-learn:scala学习笔记

    理解这些概念是学习Scala的第一步。 2. **类与对象** Scala中的类和对象是面向对象编程的核心。与Java不同,Scala的类可以有多个构造函数,且一切皆为对象。理解`case class`和`object`的区别对于掌握Scala的面向...

    Programming in Scala 2nd Edition

    ### 编程在Scala:第二版 ...通过本书的学习,读者不仅能掌握Scala语言本身,还能学会如何利用Scala构建可扩展且高性能的应用程序。对于希望深入了解Scala及其生态系统的人来说,这是一本必读的书籍。

    IDEA 创建scala工程并打指定的依赖包

    通过上述步骤,你已经学会了如何在IDEA中创建Scala项目并打包指定依赖。这对于Scala项目的开发和部署非常有帮助。记得定期更新IDEA版本和Scala插件,以获得最佳的开发体验。此外,合理配置依赖可以显著提高项目的...

    Scala编程实战基础教程

    Scala编程实战基础教程是一本专为初学者设计的教程,旨在引领读者逐步掌握Scala这门强大的多范式编程语言。Scala结合了面向对象和函数式编程的特性,使其在处理大数据和分布式计算领域,如Apache Spark,表现出色。...

    《scala编程》第3版英文版&第3版源码

    资源包含《Scala编程》第3版英文版和第3版源代码,Scala编程第3版,目前是最新版,支持Scala... 因此学习这本书,不单单是学会了scala语言本身,更重要的是扩展了视野,提升了思维能力和培养了考虑问题的思维方式方法。

    Scala集合.md

    学习spark之前,大家必须先学会Scala这门语言,他是spark的基础,这里总结了一下Scala集合的相关知识点

    actors in scala

    《Scala中的actors》是一本关于在Scala编程语言中使用actors进行编程的教程。Actors提供了一个高级的编程模型,用于构建并发和分布式系统,该模型基于轻量级进程和消息传递。本书的作者之一,Philipp Haller,是...

    Programming Scala Tackle Multi-Core Complexity on the Java Virtual Machine

    通过阅读本书,Java开发者将能够快速掌握Scala,理解其独特之处,并学会如何在多语言环境中最佳地利用这门语言。本书尤其适合那些希望在多核时代保持技术竞争力的程序员,因为它不仅提供了理论指导,还包含了大量...

    Scala.in.Action

    ### Scala in Action:深入探索Scala编程语言 #### 标题:Scala in Action ...通过本书的学习,读者不仅能够深入了解Scala的核心概念,还能学会如何利用Scala来解决实际问题,构建高效稳定的软件系统。

    Functional Programming in Scala

    《Scala中的函数式编程》一书深入探讨了函数式编程(FP)的核心概念与实践技巧,选择Scala作为实现语言,但其传授的知识可应用于任何支持FP特性的编程语言。本书旨在为读者打下坚实的基础,使其能够编写实质性的函数...

    上手提示:使用新版IDEA+Maven+Scala编写Spark程序

    通过上述步骤,我们不仅了解了如何在IDEA 2017版中创建Scala项目并使用Maven管理依赖,还学会了如何利用IDEA的内置功能来提高开发效率。Scala与Spark的结合为大数据处理带来了极大的便利,而IDEA作为一款强大的集成...

    Scala程序设计_Java虚拟机多核编程实战

    本书循序渐进地介绍了Scala的函数式编程基础,虽然篇幅...读者可以学会使用Scala静态语言的强大功能创建简洁、可扩展、高度可并行的代码。对于多核时代JVM上的并发编程,Scala是绝好的工具,而本书是你必不可少的向导。

    Manning Scala in Depth pdf

    ### Scala in Depth:一本融合函数式编程与面向对象编程的宝典 #### 一、书籍简介 《Scala in Depth》是一本由...通过阅读本书,读者将能够掌握Scala的核心概念,并学会如何将其应用于实际项目中,提升编程技能。

    scala handbook

    2.易用的数据结构:Scala库提供了许多易于使用的数据结构,如列表、数组、集合等。 3.OOP和FP的结合:Scala允许开发者使用面向对象和函数式编程两种范式。 4.动态和静态类型的结合:Scala是静态类型的,但是它能够在...

    Scala.for.the.Impatient.2nd.Edition.2016.12

    这本书的第二版在2016年12月出版,旨在帮助编程新手迅速理解Scala的核心概念和特性,从而能够在实际项目中高效地使用这门语言。 Scala是一种多范式编程语言,它结合了面向对象和函数式编程的思想。该书首先会介绍...

Global site tag (gtag.js) - Google Analytics