关于来自Rubyist的Scala的问题

时间:2010-02-28 15:05:06

标签: ruby scala scala-2.8

我最近一直在四处寻找在业余时间学习一门新语言,而Scala似乎非常有吸引力。

我有几个问题:

  1. 不会知道Java强加的 挑战学习吗?那将会 一个很大的缺点 稍后的? (即人们多久依赖一次 特定于Java的库? )

  2. 它有多大的不同 与Ruby相比? (除了 静态类型)它是否介绍 很多新的条款,或者我会 熟悉大部分语言 机制

  3. 您会推荐哪些资源? 我关注Programming ScalaBeginning Scala本书

  4. 虽然主观,Scala有趣吗? :P

  5. 由于

7 个答案:

答案 0 :(得分:36)

Ruby和Scala之间共享许多概念。我编写Ruby已经有一段时间了,所以这并不详尽。

Ruby< ==> Scala(大约!)

  • Mixins< ==>特质
  • 猴子补丁< ==> Pimp我的库(使用额外方法对包装器进行隐式转换)
  • Proc / Closure< ==>功能/功能文字
  • Duck Typing< ==>结构类型
  • 作为Proc< ==>的最后争论Curried参数列表(参见Traversable#flatMap)
  • 可枚举< ==>穿越
  • 收集< ==>图
  • 注入< ==> foldLeft / foldRight
  • Symbol.toProc< ==>占位符语法糖:people.map(_.name)
  • 动态打字简洁< ==>类型推断
  • Nil< ==> null,虽然Option更可取。 ( Nil,这是一个空列表!)
  • 一切都是表达式< ==>同上
  • 符号/哈希作为参数< ==>命名和默认参数
  • Singleton< ==> object Foo {}
  • Everthing是一个对象< ==> Everthing是一种类型或对象(包括函数)
  • 没有原语< ==>统一类型系统,Any是基元和对象的超类型。
  • 一切都是消息< ==>运算符只是方法调用

您可能会错过Ruby的功能

  • method_missing的
  • define_method etc

您应该学习的Scala功能

  • 模式匹配
  • 不可变类,特别是案例类
  • 隐式视图和隐式参数
  • 类型,类型等类型:泛型,方差,抽象类型成员
  • 对象和函数的统一,applyupdate方法的特殊含义。

答案 1 :(得分:19)

以下是我的看法:

  • 别介意不懂Java。

  • Scala非常依赖Java库。这根本不重要。你可能无法阅读一些例子,当然,但不足以成为障碍。只需很少的时间,您甚至不会注意到阅读Java API文档和Scala API文档之间的区别(除了最新的scaladoc完全不同的风格)。

    通常会假设您熟悉JVM环境。如果我可以在这里提出建议,首先要避免使用Maven,并使用SBT作为构建工具。这对于小型程序来说是不必要的,但它会使Java-lang世界中的许多问题变得更容易处理。只要您想要一个外部库,就可以了解SBT。有了它,您将不必处理任何XML:您在Scala中编写构建规则。

  • 您可能会发现很难获得类型概念和术语。 Scala不仅是静态类型,而且还有非学术语言中最强大的类型系统之一。我打赌这将是你遇到的最困难的根源。其他概念有不同的术语,但你会很快与Ruby相提并论。

    但这并不是一个很大的障碍 - 如果你愿意,你可以克服它。主要的缺点是你可能会觉得你后来学到的任何其他静态类型语言都是笨拙和有限的。

  • 你没有提到你看过哪些 Programming Scala。有两个,加上一个Scala编程。后者是由语言创造者编写的,并且被广泛认为是一本优秀的书,但也许有点慢。其中一个编程Scala是由一个推特人 - 亚历克斯佩恩和前对象导师的Dean Wampler编写的。这也是一本非常好的书。开始Scala是由Lift的创建者David Pollack编写的,人们已经对它说了很多好话。事实上,我没有听到任何关于任何Scala书籍的抱怨

    其中一本书肯定会有所帮助。此外,对Scala问题的Stack Overflow支持非常好 - 我尽力确保这一点! :-)有scala-users邮件列表,也可以得到答案(只要人们不是很忙),Freenode上有#scala IRC频道,你也会得到很好的支持。有时人们不在身边,但是,如果他们在,他们会帮助你。

    最后,有博客。对初学者来说最好的可能是Daily Scala。您可以找到许多其他人Planet Scala。其中,我自己的Algorithmically Challenged,最近没有太多的爱,但我会回到它。 : - )

  • Scala为我的编程带来了乐趣。当然,我正在做Java,这是博客,imho。我花了这么多时间回答Stack Overflow问题的一个原因是,我喜欢为所提出的问题制定解决方案。

答案 2 :(得分:8)

我将介绍一下需要多少Java知识的注意事项,因为我不同意它根本不是问题。有一些关于Java的东西与scala直接相关,你应该理解。

  1. Java Memory Model 以及平台为并发提供的机制。我在谈论同步,线程等

  2. 基本类型(double,float等)和引用类型(即Object的子类)之间的区别。 Scala提供了一些很好的机制来隐藏开发人员,但是如果编写必须具有高效性的代码,知道这些工作是如何工作的,这是非常重要的

  3. 这有两个方面:Java运行时提供的功能(我怀疑,虽然我可能错了)在Ruby中不可用,并且对您有很大好处:

    • 管理扩展程序(MBean)
    • JConsole(用于运行时监视内存,CPU,调试并发问题)
    • JVisualVM(用于调试内存和性能问题的代码的运行时检测)

    这些要点#1和#2并非难以逾越的障碍,我认为这里提到的其他相似之处对你有利。哦,Scala肯定很有趣!

答案 3 :(得分:7)

我没有Ruby背景但是,我可以帮助你。

  1. 我不知道Java不是一个缺点,但它可能有所帮助。在我看来,Java库经常使用,但即使是训练有素的Java编码器也不会全部知道它们,所以这里没有缺点。您将通过学习Scala来学习Java库的某些部分,因为即使Scala库也使用它们。

  2. -

  3. 我从阅读Programming Scala开始,然后翻过来阅读Scala库的来源。后者帮助了解了很多语言。和往常一样:代码,代码,代码。没有编码的阅读不会让你到任何地方,但我相信你已经知道了。 :-) 另一个有用的资源是博客,有关优秀Scala博客的汇编,请参阅https://stackoverflow.com/questions/1445003/what-scala-blogs-do-you-regularly-follow

  4. 是的!如你所说,这是非常主观的。但对我来说,来自Java背景,这很有趣。

答案 4 :(得分:3)

现在已经很晚了,但我在某种程度上同意oxbow_lakes所说的话。我最近从Python转换到了Scala,并且了解Java的工作原理 - 尤其是关于泛型类型的Java限制 - 帮助我理解了Scala的某些方面。

最引人注目的是:

  1. Java有一种可怕的错误,称为“类型擦除”。不幸的是,这种破坏也存在于JVM中。这尤其会影响使用泛型类型的编程 - 这个问题根本不会出现在像Ruby和Python这样的动态类型语言中,但在静态类型语言中却非常大。 Scala做得很好,可以解决这个问题,但破坏的程度意味着其中一些不可避免地会流入Scala。此外,Scala中针对此问题的一些修复(例如清单)是最新的和hackish,并且确实需要了解底层的内容。请注意,这个问题最初可能不会影响您对Scala的理解,但是当您开始编写使用泛型类型的真实程序时,您会遇到它,因为有些事情你会尝试去做就行不通,除非你理解类型擦除所强加的限制,否则你不会知道为什么。

  2. 迟早你也会遇到与另一个Java错误相关的问题,这是类型分为对象(类)与原始类型(整数,浮点数,布尔值) - 特别是,原始类型不是对象系统的一部分。 Scala实际上做了一个很棒的工作,隐藏了这个,但是知道Java在某些特殊情况下做了什么可能会有所帮助,否则可能会很棘手 - 特别是涉及泛型类型,主要是因为#中描述的类型擦除破坏1。 (类型擦除在使用数组,散列表和类似的泛型类型而不是原语时也会导致性能受到重大影响;这是知道Java将会有很大帮助的一个领域。)

  3. Misfeature#3 - 数组也在Java中专门处理并且非正交处理。 Scala隐藏这个并不像原语那么无缝,但比类型擦除要好得多。隐藏机制有时会暴露出来(例如ArrayWrapper类型),这可能偶尔会导致问题 - 但实际上最大的问题,不足为奇,同样是泛型类型。

  4. Scala类参数以及Scala处理类构造函数的方式。在这种情况下,Java不会被破坏。可以说,Scala也不是,但它处理类构造函数的方式相当不寻常,实际上我很难理解它。我只是通过弄清楚相关的Scala代码如何被翻译成Java(或者更准确地说,转换成编译的Java),然后推理Java会做什么来真正理解Scala的行为。因为我认为Ruby在这方面的工作方式与Java非常相似,所以我认为你不会遇到太多问题,尽管你可能需要做同样的心理转换。

  5. I / O。这实际上是一个库问题而不是语言问题。在大多数情况下,Scala提供了自己的库,但Scala并没有真正的I / O库,所以你几乎别无选择,只能直接使用Java的I / O库。对于Python或Ruby程序员来说,这种转换有点痛苦,因为Java的I / O库庞大而且体积庞大,并且在执行简单任务时非常容易使用,例如:迭代文件中的所有行。

  6. 请注意,除了I / O之外,您还需要直接使用Java库来处理与操作系统或相关任务交互的其他情况,例如:使用时间和日期或获取环境变量,但通常这不难理解。您可能需要使用的其他主要Java库是

    1. 子流程调用,也有点大而且笨重
    2. 网络 - 但这总是有些痛苦
    3. 反射,即动态检查类上的方法和/或字段,或者在编译时未知名称时按名称动态调用方法。这有些深奥的东西,大多数人不需要处理。显然Scala 2.10将拥有自己的反射库,但是目前您必须使用Java反射API,这意味着您需要了解有关Scala如何转换为Java的大量信息。 (值得庆幸的是,Scala编译器有一个-print选项,可以准确显示转换的发生方式。)

答案 5 :(得分:1)

重新。要点1.不熟悉Java 语言不一定是个问题。第三方库大致无缝集成到Scala中。但是,对集合差异的一些认识可能是好的(例如,Scala列表不是传统的Java列表,API可能期望后者)。

与Java相关的技能与Java 平台有关。即你仍然在使用一个执行类加载,垃圾收集,JIT编译等的JVM。所以这方面的经验很有用。但根本不需要。

请注意,Scala 2.8即将发布,并且存在一些不兼容的更改。 2.7。因此,您购买的任何书籍都应该意识到这些差异。

答案 6 :(得分:1)

这是另一个迟到的答案,最近我自己来到Scala,但我可以回答1,3和4:

1)我将一个大型的,多方面的F#项目移植到Scala,而不使用Java或.NET库。因此,对于许多项目,人们可以完全坚持原生Scala。 Java生态系统知识将是一个优势,但它可以在学习Scala期间和之后逐渐获得。

3) Scala中的编程不仅非常适合学习Scala,它是所有语言中为数不多的真正可读的计算机书籍之一。这对以后的参考很方便。

4)我使用了近十几种不同的编程语言,从汇编语言到Prolog,但Scala和F#是我用过的两种最有趣的编程语言 - 大幅度提升。 (Scala和F#非常相似,是两个不同生态系统中“融合进化”的一个例子--JVM和.NET。)

-Neil