java调用scala枚举_初探Scala编程:编写脚本,循环与枚举

本文接着上一节内容,继续介绍一些Scala编程的入门知识。

第四步:编写一些Scala脚本

尽管Scala的设计目的是帮助程序员建造非常大规模的系统,但它也能很好地缩小到做脚本的规模。脚本就是一种经常会被执行的放在文件中的句子序列。把以下代码放在hello.scala文件中:println("Hello, world, from a script!")

然后运行:$ scala hello.scala

于是你又会得到另外的祝词:Hello, world, from a script!

通过Scala的名为args的数组可以获得传递给Scala脚本的命令行参数。Scala里,数组以零开始,通过在括号里指定索引访问一个元素。所以Scala里数组steps的***个元素是steps(0),不是像Java里的steps[0]。作为测试,输入以下内容到新文件helloarg.scala:

// 向***个参数打招呼println("Hello, " + args(0) + "!")

然后运行:println("Hello, " + args(0) + "!")

这条命令里,"planet"被作为命令行参数传递,并在脚本里作为args(0)被访问。因此,你会看到:Hello, planet!

注意这个脚本包括了一条注释。Scala编译器将忽略从//开始到行尾截止的以及在/*和*/之间的字符。本例还演示了String使用+操作符的连接。这与你的预期一样。表达式"Hello, "+"world!"将产生字符串"Hello, world!"。

第五步:用while循环;用if判断

要尝试while,在printargs.scala文件里输入以下代码:vari=0

while (i

println(args(i))

i += 1

}

注意

虽然本节的例子有助于解释while循环,但它们并未演示***的Scala风格。在下一段中,你会看到避免用索引枚举数组的更好的手段。

这个脚本开始于变量定义,var i = 0。类型推断认定i的类型是scala.Int,因为这是它的初始值的类型,0。下一行里的while结构使得代码块(大括号之间的代码)重复执行直到布尔表达式i < args.length为假。args.length给出了args数组的长度。代码块包含两句话,每个都缩进两个空格,这是Scala的推荐缩进风格。***句话,println(args(i)),输出第i个命令行参数。第二句话,i += 1,让i自增一。注意Java的++i和i++在Scala里不起作用,要在Scala里自增,必须写成要么i = i + 1,或者i += 1。用下列命令运行这个脚本:$ scala printargs.scala Scala is fun

你将看到:Scala

is

fun

想要更好玩儿一些,就把下列代码输入到新文件echoargs.scala:vari=0

while (i

if (i != 0)

print(" ")

print(args(i))

i += 1

}

println()

在这个版本里,用print调用替代了println调用,这样所有参数将被输出在同一行里。为了更好的可阅读性,你应该用if(i != 0)检查,除了***个之外的每个参数前插入一个空格。由于***次做while循环时i != 0会失败,因此在头一个参数之前不会输出空格。***,你应该在末尾多加一个println,这样在输出所有参数之后会有一个换行。这样你的输出就非常漂亮了。如果用下面的命令运行脚本:$ scala echoargs.scala Scala is even more fun

就能得到:Scala is even more fun

注意Scala和Java一样,必须把while或if的布尔表达式放在括号里。(换句话说,就是不能像在Ruby里面那样在Scala里这么写:if i < 10。在Scala里必须写成if (i < 10)。)另外一点与Java类似的,是如果代码块仅有一个句子,大括号就是可选的,就像echoargs.scala里面if句子演示的。并且尽管你没有看到,Scala也和Java一样使用分号分隔句子的,只是Scala里的分号经常是可选的,从而可以释放你的右小手指。如果你有点儿罗嗦的脾气,那么就把echoargs.scala脚本写成下面的样子好了:vari=0;

while (i

if (i != 0) {

print(" ");

}

print(args(i));

i += 1;

}

println();

第六步:用foreach和for枚举

尽管或许你没意识到,在前一步里写while循环的时候,你正在用指令式:imperative风格编程。指令式风格,是你常常使用像Java,C++和C这些语言里用的风格,一次性发出一个指令式的命令,用循环去枚举,并经常改变共享在不同函数之间的状态。Scala允许你指令式地编程,但随着你对Scala的深入了解,你可能常会发现你自己在用一种更函数式:functional的风格编程。实际上,本书的一个主要目的就是帮助你变得对函数式风格感觉像和指令式风格一样舒适。

函数式语言的一个主要特征是,函数是***类结构,这在Scala里千真万确。举例来说,另一种(简洁得多)打印每一个命令行参数的方法是:args.foreach(arg=>println(arg))

这行代码中,你在args上调用foreach方法,并把它传入函数。此例中,你传入了带有一个叫做arg参数的函数文本:function literal。函数体是println(arg)。如果你把上述代码输入到新文件pa.scala,并使用命令执行:$ scala pa.scala Concise is nice

你会看到:Concise

is

nice

前例中,Scala解释器推断arg的类型是String,因为String是你调用foreach的那个数组的元素类型。如果你喜欢更显式的,你可以加上类型名,不过如此的话你要把参数部分包裹在括号里(总之这是语法的普通形式):args.foreach((arg: String) =>println(arg))

运行这个脚本的结果与前一个相同。

如果你更喜欢简洁的而不是显式的风格,就可以充分体会到Scala特别简洁的优越性。如果函数文本由带一个参数的一句话组成,你都不需要显式命名和指定参数。 这样,下面的代码同样有效:args.foreach(println)

总而言之,函数文本的语法就是,括号里的命名参数列表,右箭头,然后是函数体。语法演示在图2.2中。

a1b1d3237110d9573fb9dfb7e87189e8.png

现在,到这里你或许想知道那些你在指令式语言如Java或C里那么信任的for循环到哪里去了呢。为了努力引导你向函数式的方向,Scala里只有一个指令式for(称为for表达式:expression)的函数式近似。目前你还看不到他们全部的力量和表达方式,直到你读到了(或者先瞄一眼)第7.3节,我们仅仅带您在这里领略一下。创建一个新文件forargs.scala,输入以下代码:for (arg

println(arg)

这个表达式里“for”之后的括号包含arg

如果执行forargs.scala脚本:$ scala forargs.scala for arg in args

可以看到:for

arg

in

args

Scala的for表达式可以比这个做得更多,但是这个例子足以让你起步了。

本文节选自《Programming in Scala》

【相关阅读】

【责任编辑:Reno TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值