是什么使斯卡拉这样一种美妙语言,其他比类型的系统?几乎我读到的有关该语言的所有内容都将"强类型"作为使用Scala的一个重要原因,但必须有更多.什么是其他令人信服的和/或酷的语言功能,使Scala成为一个非常有用的工具?
以下是一些让我更喜欢Scala的东西(比如通常的Java):
a)类型推断.Java的做法:
Map> list = new HashMap >()
..与Scala相比,相当冗长.如果您给出其中一个列表,编译器应该能够弄明白.
b)一阶函数.同样,这个功能可以用类模拟,但它很难看.
c)有map
和的集合fold
.这两个与(b)相关,而且每次我必须编写Java时,这两个都是我希望的.
d)模式匹配和案例类.
e)差异,这意味着如果S extends T
,那么List[S] extends List[T]
也是如此.
抛出一些静态类型的优点,我在语言上卖得很快.
它是来自一堆语言的最佳位的混搭,什么是不爱的:
Ruby的简洁语法
Java的表现
Erlang的演员支持
瓶盖/块
方便地图和数组的简写
Scala经常因为有封闭和暗示而游行.真的不足为奇,因为缺少闭包和显式输入可能是Java样板的两个最大来源!
但是一旦你对它进行了更深入的研究,它就远远超出了Java而没有烦人的位,也许Scala的最大优势不是一个特定的命名功能,而是统一其他答案中提到的所有功能的成功程度. .
例如,面向对象和函数编程的结合:因为函数是对象,Scala能够使Maps实现Function接口,所以当你使用map来查找一个值时,与使用函数计算一个函数在语法上并没有什么不同.值.在很好地统一这些范例时,Scala确实是一种后功能语言.
或者操作符重载,这是通过实际上没有运算符实现的,它们只是中缀表示法中使用的方法.所以1 + 2
只是+
在整数上调用方法.如果该方法被命名,plus
那么你将使用它,因为1 plus 2
它没有什么不同1.plus(2)
.由于另外的特征组合,这是可能的; Scala中的所有东西都是一个对象,没有原语,所以整数可以有方法.
还提到了类型类,通过高级类型,单例对象和隐含的组合实现.
其他功能一起使用的是案例类和模式匹配,允许您轻松构建和解构代数数据类型,而无需手动编写Java所需的所有繁琐的相等,哈希码,构造函数和getter/setter逻辑.
默认情况下指定不变性,提供惰性值以及提供第一类函数都可以为您提供非常适合构建高效功能数据结构的语言.
这个列表还在继续,但我已经使用Scala超过3年了,而且我几乎每天都对一切都在一起工作的方式感到惊讶.
Scala也是一种小语言,其规格(令人惊讶的是!)只需要大约是Java的1/3.这部分是因为Java在Scala简化了规范中有很多特殊情况,部分原因是因为删除了原语和运算符等功能,部分原因是许多功能已从语言转移到库中.
有鉴于此,Scala库作者可用的所有技术也可供任何Scala用户使用,这使其成为定义自己的控制流构造和构建DSL的理想语言.这已被用于像Akka这样的项目 - 第三方Actor框架.
最后,它扩展了所有编程风格.
运行时解释器(称为REPL)允许您在交互式会话中快速探索想法,并且Scala文件也可以作为脚本运行,而无需显式编译.当与类型推断结合使用时,这为Scala提供了动态语言的感觉,例如Ruby,Perl或bash脚本.
另一方面,特征,类,对象和自我类型允许您基于不同的组件构建一个完整的企业系统,并使用依赖注入而无需第三方工具.Scala还与几乎与本机Java相当的Java库集成,通过在JVM上运行,可以利用该平台上提供的所有速度优势,以及在tomcat等容器中完全可用,或者与OSGi的.
我是Scala的新手,但我的印象是:
真正好的JVM集成将是驱动因素.JRuby可以调用java和java可以调用JRuby代码,但它显式调用另一种语言,而不是Scala-Java的干净集成.因此,您可以使用Java库,甚至可以在同一个项目中混合使用.
当我意识到驱动下一个优秀语言的东西很容易并发时,我开始关注scala.从性能角度来看,JVM具有良好的并发性.我确信有人会说Erlang更好,但Scala实际上可以被普通程序员使用.
Java陷入困境的地方就是如此痛苦的冗长.创建和传递Functor需要太多的字符.Scala允许将函数作为参数传递.
在Java中,无法创建联合类型或将接口应用于现有类.这些在Scala中都很容易.
静态类型通常具有冗长的严厉惩罚.Scala消除了这种缺点,同时仍然提供静态类型的优势,即编译时类型检查,它使编辑器中的代码辅助更容易.
扩展语言的能力.这已经让Lisp持续了几十年,并且允许Ruby on Rails.
类型系统确实是Scala最显着的特征.它比Java更具有语法上的便利性.
但对我来说,Scala最引人注目的功能是:
一流的模块.
高级类型(类型构造函数多态).
暗示.
实际上,这些功能让您可以近似(并在某些方面超越)Haskell的类型类.结合起来,它们可以让您编写特别模块化的代码.
就在短期内:
您可以获得Java库的强大功能和平台独立性,但没有样板和冗长.
您可以获得Ruby的简单性和生产力,但使用静态类型和编译的字节码.
您可以获得Haskell的功能优势和并发支持,但没有完全的范例转换和面向对象的好处.
我发现它的所有特征都具有特别的吸引力,其中包括:
大多数需要Java加载样板代码的面向对象设计模式本身都受支持,例如Singleton(通过对象),Adapter,Decorator(通过traits和implicits),Visitor(通过模式匹配),Strategy(通过闭包)等.
您可以非常简洁地定义域模型和DSL,然后您可以使用必要的功能(通知,关联处理;解析,序列化)扩展它们,而无需代码生成或框架.
最后,与支持良好的Java平台完全互操作.您可以在两个方向上混合使用Java和Scala.在经历了使代码难以维护的Java烦恼之后切换到Scala时没有太多的惩罚和兼容性问题.
函数式编程带给了JVM