您所在的位置:开发 > Java > Java+ > Scala代码编写中常见的十大陷阱(1)

Scala代码编写中常见的十大陷阱(1)

2010-01-26 15:32 阿风 译 51CTO.com 字号:T | T
一键收藏,随时查看,分享好友!

很多Java开发者在学习Scala语言的时候,往往觉得Scala的语法和用法有些过于复杂,充满语法糖,太“甜”了。在使用Scala编写代码时,由于语法和编写习惯的不同,很多开发者会犯相同或相似的错误。一位Scala狂热爱好者近日总结了十大这样的错误,以供参考。

AD:

【51CTO精选译文】对于支持并发和分布式处理、高可扩展、基于组件的应用程序来说,Scala的功能是很强大的。它利用了面向对象和函数式程序设计的优点。这种基于Java虚拟机的语言在宣布Twitter正使用它时受到了最多的冲击(相关51CTO评论:从Scala进驻Twitter看多语言混杂系统的前景)。如果使用正确,Scala可以大量减少应用程序对代码的需求。

对于Scala编程, 我们收集了这些常见代码编写中的陷阱。这些技巧来自于Daniel Sobral,一个曾参加过FreeBSD项目和Java软件开发工程的Scala狂热爱好者。

1. 语法错误

认为  “yield” 像 ”return” 一样。有人会这样写:

  1. for(i <- 0 to 10) {  
  2.   if (i % 2 == 0)  
  3.     yield i  
  4.   else 
  5.     yield -i  

正确的表示应该是:

  1. for(i <- 0 to 10)   
  2. yield {  
  3.   if (i % 2 == 0)  
  4.     i  
  5.   else 
  6.     -i  

2. 误用和语法错误

滥用scala.xml.XML.loadXXX。这个的语法分析器试图访问外部的DTD、strip组件或类似的东西。在scala.xml.parsing.ConstructingParser.fromXXX中有另一个可选的语法分析器。同时,在处理XML时忘记了等号两端的空格。比如:

  1. val xml=<root/> 

这段代码真正的意思是:

  1. val xml.$equal$less(root).$slash$greater  
  2.   

这种情况的发生是由于操作符相当随意,而且scala采用这样一种事实:字母数字字符与非字母数字字符通过下划线可以结合成为一个有效的标识符。这也使得“x+y”这样的表达式不会被当成一个标识符。而应该注意 “x_+”是一个有效的标识符。所以,赋值标识符的写法应该是:

  1. val xml = <root/> 

3. 用法错误

为那些根本不是无关紧要的应用加入Application特征。

  1. object MyScalaApp extends Application {    
  2.   // ... body ...  

示例部分的问题在于,body部分在单元对象初始化时执行。首先,单元初始化的执行是异步的,因此你的整个程序不能与其它线程交互;其次,即时编译器(JIT)不会优化它,因此你的程序速度慢下来,这是没有必要的。

另外,不能与其它线程的交互也意味着你会忘记测试应用程序的GUI或者Actors。

4. 用法错误

试图模式匹配一个字符串的正则表达式,而又假定该正则表达式是无界的:

  1. val r = """(\d+)""".r  
  2. val s = "--> 5 <---" 
  3. s match {  
  4.   case r(n) => println("This won't match")  
  5.   case _ => println("This will")  

此处的问题在于, 当模式模式匹配时, Scala的正则表达式表现为如同开始于”^”,结束于”$”。使之工作的正确写法是:

  1. val r = """(\d+)""".r  
  2. val s = "--> 5 <---" 
  3. r findFirstIn s match {  
  4.   case Some(n) => println("Matches 5 to "+n)  
  5.   case _ => println("Won't match")  

或者确保模式能匹配任意前缀和后缀:

  1. val r = """.*(\d+).*""".r  
  2. val s = "--> 5 <---" 
  3. s match {  
  4.   case r(n) => println("This will match the first group of r, "+n+", to 5")  
  5.   case _ => println("Won't match")  



分享到:

热点职位

更多>>

热点专题

更多>>

读书

超级网管员——网络基础
本书全面系统地概括了计算机网络的基本理论,详细阐述了OSI模型与网络协议、网络规划与综合布线、对等网络与服务器/客户端网络、

51CTO旗下网站

领先的IT技术网站 51CTO 领先的中文存储媒体 WatchStor 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i