十二步学会Scala(2):Scala的循环和数组
创始人
2024-06-09 02:20:32
0

AlanWu在上一篇《十二步学会Scala(1)》中介绍了Scala的变量定义和方法定义,这一篇将进行第五到第八步,介绍循环和数组。

原文地址:AlanWu的博客 | 51CTO编辑推荐:Scala编程语言专题

第五步:运行脚本

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

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

  1. println("Hello, world, from a script!"

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

  1. D:\>scala hello.scala  
  2. Hello, world, from a script!  
  3.  
  4. D:\>  

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

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

Scala中使用while和java差不多。

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

  1. var i = 0 
  2. while (i < args.length) {  
  3. println(args(i))  
  4. i += 1 

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

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

cmd

  1. D:\>scala printargs.scala Scala is fun  
  2. Scala  
  3. is  
  4. fun  
  5.  
  6. D:\>  

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

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

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

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

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

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

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

  1. args.foreach(arg => println(arg)) 

运行pa.scala你会看到

cmd

  1. D:\>scala pa.scala Scala is easy  
  2. Scala  
  3. is  
  4. easy  
  5.  
  6. D:\>  

arg是迭代变量,不需要手工赋值,编译器会把传递给它。同时编译器会认出arg的类型,所以这里不需要定义类型。

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

把arg定义上类型

pa.scala

  1. args.foreach((arg: String) => println(arg)) 

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

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

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

匿名方法的定义 

方法参数 => 方法体

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

很懒的程序员会发现,这里arg好像没什么必要,唯一参数传给唯一的方法体。在java这样的想法可能是空幻想,但Scala帮你实现了!

我们可以省略成:

pa.scala

  1. args.foreach(println) 

就这么少!

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

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

  1. for arg in ARGV # Remember, this is Ruby, not Scala  
  2. puts arg  
  3. end 

用Scala的for来实现

  1. for (arg <- args)  
  2. println(arg) 

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

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

第八步: 数组

数组是定义数据类型很重要很基础的容器。在Scala里如何使用数组呢?这次我们的参数由程序定义,并把他们打印出来。

建个文本文件,叫paramswithvalues.scala

  1. val greetStrings = new Array[String](3)  
  2.  
  3. greetStrings(0) = "Hello" 
  4. greetStrings(1) = ", " 
  5. greetStrings(2) = "world!\n" 
  6.  
  7. for (i <- 0 to 2)  
  8. print(greetStrings(i))  

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

1. 定义数组类型

Scala代码

  1. val greetStrings = new Array[String](3)   

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

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

括号3表示数组容量是3

2. 数组元素赋值

Scala代码

  1. greetStrings(0) = "Hello"  

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

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

其实Scala是被冤枉的。

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

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

Scala代码

  1. greetStrings.update(0"Hello")   

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

Scala代码

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

3. 数组元素读取

在for循环体里面有

Scala代码

  1. print(greetStrings(i))   

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

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

Scala代码

  1. print(greetStrings.apply(i))   

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

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

Scala代码

  1. val greetStrings = new Array[String](3)    
  2.     
  3. greetStrings.update(0"Hello")    
  4. greetStrings.update(1", ")    
  5. greetStrings.update(2"world!\n")    
  6.     
  7. for (i <- 0.to(2))    
  8.   print(greetStrings.apply(i))   

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

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

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

Scala代码

  1. for (i <- 0 to 2)   

to是0的一个方法,

Scala代码

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

数组就基本介绍到这里。接下来一篇将介绍集合类。

【编辑推荐】

  1. 十二步学会Scala(1):从下载安装到定义方法
  2. Scala讲座:面向对象和函数式的特点总结
  3. 万物皆对象:介绍Scala对象
  4. Scala的泛型:最强大的特性
  5. Scala的Trait:可以包含代码的接口

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...