我注意到IDE的支持远非如此,但该语言本身更清晰地支持函数式编程习惯用法。
我注意到IDE的支持远非如此,但该语言本身更清晰地支持函数式编程习惯用法。
Answers:
我已经为Scala编程了一年多了,所以我会花一年时间回答这个问题。
上面的几点或多或少是我开始学习Scala之前所想到的。
在一年的时间里,这是我发现的:
好吧,我认为Scala太复杂了。感觉就像C ++,因为它有无数种不同的处理方式。有些人会称其为“丰富”,“表现力”或“力量”,但您的里程可能会有所不同。在许多现实世界的项目中,您将不得不人为地限制要使用的语言功能以及不使用的语言功能,以便所有参与其中的开发人员都可以说相同的语言子集。
对于函数式编程,我更喜欢Clojure,它比Scala更简单。
让圣战开始;-)
大约一年前,随着我对继续使用Java的创业公司产品的未来越来越沮丧,我决定尝试Scala。当时我已经在使用JavaScript和Python进行编程,Ruby也是一个不错的选择,但是我正在寻找一种静态类型的语言,最好是一种可以在JVM上运行的语言。
我确实真的很喜欢Scala,但确实如此,但是我发现它的代码非常丑陋且难以理解。我非常想知道,如果Scala是我们对Java的最佳解决方案,那么我肯定会被拧死并被判处继续使用我不喜欢的语言工作……
幸运的是,不久之后,我发现了Fantom。哦,我喜欢它!对我来说,这就像美国人对德国官僚机构的出色回答!它符合我在Scala中寻找的要求,但更加优雅。它具有Vim,Eclipse和Netbeans集成,一个不错的Web框架,与之一起运行的成熟产品,一个很小但非常有用的社区 ...动态和静态输入!我很高兴!
(我可以继续,但是这篇文章的目的是关于Scala,而不是Fantom,所以我在这里停止。我的偏好很明确,尽管这篇文章将两者进行了比较。我永远无法理解为什么与Scala相比,Fantom很少受到关注。但是,如果您一直收听此播客[ mp3 ] ,那么显然我并不是唯一的一个。)
2年前,当我最初涉足Scala时,它看起来有些陌生,对我来说很吓人。在某种程度上,我发现核心语言实际上比Java简单得多,但是它的语法和语义非常灵活,即使没有宏功能,您也可以创建类似它的新语言结构。从那以后,我已经将所有Java项目完全切换到Scala,因为它使我无需编写太多样板代码即可编写代码。
我喜欢Clojure,但是在某些情况下,平台需要您将其编译为静态字节码(Android,applet等),而在Scala中您可以做到这一点。
Scala使您可以通过功能方式解决许多问题,但是我经常发现使用类感觉更自然的问题。这使事情变得更加复杂,但是远远没有C ++的复杂性和痛苦。
当我真正开始学习该语言时,对我来说最大的收获是,我可以像在Java中一样编程,而不会产生噪音(有点像启动Groovy时的情况),但最终您想尝试更深入地研究它的功能语言-它与您一同成长。
关于IDE的问题:将Emacs用于所有功能后,我所有的IDE问题都消失了:-)
我喜欢Scala的原因很多,但是有一个经常被忽略的原因:它的简单性。
Scala可能不像Oberon那样简单,但是它比其他一些语言要简单得多。Scala语言规范为〜160页,Java语言规范为〜600页(仅是语言,而不是JVM或库!),ECMA-334 C#语言规范(AFAIK对应于Visual C#2.0的子集)为约440页(其中不包含LINQ查询理解,lambda表达式,扩展方法,通用协和和dynamic
,自变量,具有默认值的可选参数,关键字参数var
)。甚至ECMAScript 5.1的当前草案也更大,约为210页。当然还有我自己的“默认”语言Ruby,其当前的ISO Draft大约有310页,仅指定Ruby 1.8.6、1.9.1和1.9.2交集的几乎很小的子集。
这是Scala的缺点:
首先,空指针是一个非常糟糕的主意。霍阿雷称这是他的“十亿美元的错误”,但斯卡拉的情况更糟。它具有名为null,Null,None和Nil的对象。null是与Java的互操作性。Null是W3C DOM规范中的空指针,None是应替换为null的内容,Nil是空的东西。
当语言结构变得笨拙时,通常应该由程序员而不是语言来负责。但是,在Scala中,核心语言已经包含库类,其唯一记录的行为是“这是黑客”。不相信吗?在scaladoc中搜索scala.xml.Group。
最后一点同样重要,Scala的文档记录很差。官方文档中几乎没有任何scala类附带示例代码。Scala比Java更难学习,并且需要计算机科学方面的深厚知识。
为了避免被误认为是Scala-hater,这是我喜欢的东西:
null
是Java的空指针,Null
是它的“类型”。None
是的一个可能的“状态” Option[T]
,具有一个或一个零元素的集合。Nil
是一个空列表。虽然您想让它听起来令人恐惧,但事实并非如此。这些类型不能相互替换或互换,它们的行为与应有的行为完全相同。
Scala 很复杂。没办法!它的语法非常灵活,可以通过多种方式进行自定义(所有运算符/中缀表示法之上)-类型系统比我所知道的任何其他语言具有更多不同的功能。
因此事情并不像Haskell那样直截了当:Typeclasss涵盖了所有内容。
当Scala尝试将函数式编程,OO,过程式编程和Java库以及自己的想法组合在一起时,我们最终得到了很多概念,这些概念似乎以某种方向“朝着同一方向”发展:
起初在它们之间进行选择似乎很困难,并且人们可能会很容易怀疑自己是否找到了解决某些问题的正确方法。甚至可以通过滥用implicit
s 来制造骇人的东西。
但是有趣的是:Scala有效。有时很难理解为什么(尤其是通过隐式转换+继承+ ...一些对象具有功能X
),但是您不必在大多数时候都去担心。
尽可能简单地编写Scala,它将起作用。不要对一切可能的事物感到困惑,而要使用所需的东西。而且,如果您需要某些东西,您可以肯定Scala拥有它;)
而且,您获得的越好,就越能够使用运算符,隐式,单子,时髦的语法自定义Scala,最终获得接近DSL的东西,可以完美解决您的问题。
毕竟,您始终可以将Scala用作具有更好,更简单的语法,类型推断和某些功能的更好的Java。
这是一种出色的语言,在许多方面都比Java简单。
出于与大多数人(无论是否为程序员)不喜欢学习新的编程语言相同的原因,大多数人都不喜欢它(无论是Java程序员还是不喜欢Java程序员)。我怀疑大多数学习编程语言的人甚至都不喜欢学习那种语言。
如果您担心一种语言像C ++一样复杂,我会避免像瘟疫一样使用Clojure。对于完全不了解一种或两种语言的人们,Scala比Clojure更复杂的抱怨已成为后备争论。
Clojure具有宏,这意味着您可以根据需要随意更改语言的语法,不仅为您提供“无数种不同的处理方式”,而且还为您提供了几乎无限多种处理方式。程序员使用宏创建的所有新语法都不会在语言规范的任何地方记录。
您说:“但是我们可以避免使用宏或规范代码中允许使用的宏”。恭喜,您现在必须“人为限制要使用的语言功能,而不要使用哪些语言”,这正是使用Scala的Clojure的胡言乱语的白痴作为避免开始使用Scala的原因。