27

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

我对此有几个问题:

  1. 不了解 Java 会不会给学习带来挑战?以后会不会是很大的劣势?(即人们多久依赖 Java 特定的库?)

  2. 它与 Ruby 相比有多大区别?(除了静态类型)它会引入很多新术语,还是我会熟悉大多数语言的机制?

  3. 你会推荐什么资源?我有我的眼睛Programming ScalaBeginning Scala书籍

  4. 虽然是主观的,但 Scala 编程有趣吗?:P

谢谢

4

7 回答 7

36

Ruby 和 Scala 之间有许多共同的概念。自从我编写 Ruby 代码以来已经有一段时间了,所以这并不详尽。

Ruby <==> Scala(大约!)

  • Mixins <==> 特征
  • Monkey Patching <==> Pimp My Library(隐式转换为带有额外方法的包装器)
  • Proc/Closure <==> 函数/函数字面量
  • 鸭子类型 <==> 结构类型
  • 最后一个参数作为 Proc <==> Curried 参数列表(参见 Traversable#flatMap)
  • 可枚举 <==> 可遍历
  • 收集 <==> 地图
  • 注入 <==> foldLeft/foldRight
  • Symbol.toProc <==> 占位符语法糖:people.map(_.name)
  • 动态类型简洁 <==> 类型推断
  • Nil <==> null,尽管 Option 更可取。(不是Nil,这是一个空列表!)
  • 一切都是一个表达式 <==> 同上
  • 符号/哈希作为参数 <==> 命名和默认参数
  • 单例 <==>object Foo {}
  • Everthing 是一个对象 <==> Everthing 是一个类型或对象(包括函数)
  • No Primitives <==> 统一类型系统,Any 是基元和对象的超类型。
  • 一切都是消息 <==> 运算符只是方法调用

你可能会错过的 Ruby 特性

  • 方法缺失
  • 定义方法等

你应该学习的 Scala 特性

  • 模式匹配
  • 不可变类,特别是案例类
  • 隐式视图和隐式参数
  • 类型、类型和更多类型:泛型、变体、抽象类型成员
  • 对象和功能的统一,applyupdate方法的特殊含义。
于 2010-02-28T15:59:45.813 回答
19

这是我的看法:

  • 没关系不知道Java。

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

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

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

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

  • 您没有提到您关注的是哪个Programming Scala。有两个,加一个 Scala 编程。后一本书是由语言创造者编写的,被广泛认为是一本优秀的书,尽管可能有点慢。其中一个 Programming Scala 是由 Twitter 人员 Alex Payne 和前 Object Mentor 的 Dean Wampler 编写的。这也是一本非常好的书。Scala 的开始是由 Lift 的创建者 David Pollack 编写的,人们对它赞不绝口。事实上,我还没有听到有人抱怨过任何 Scala 书籍。

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

    最后,还有博客。最适合初学者的可能是Daily Scala。你会发现很多很多其他的都是Planet Scala。其中,我自己的Algorithmically Challenged,最近不太受欢迎,但我会回到它。:-)

  • Scala 为我恢复了编程的乐趣。当然,我正在做 Java,这很糟糕,恕我直言。我花这么多时间回答 Stack Overflow 问题的原因之一是我喜欢为提出的问题制定解决方案。

于 2010-02-28T17:14:00.503 回答
8

我将提出一个关于需要多少 Java 知识的警告,因为我不同意这根本不是问题。Java 有一些与 scala 直接相关的内容,您应该了解这些内容。

  1. Java 内存模型以及平台为并发提供的机制。我说的是同步、线程等

  2. 原始类型(double、float 等)和引用类型(即 的子类)之间的区别Object。Scala 提供了一些很好的机制来向开发人员隐藏这一点,但如果编写必须是高性能的代码,了解它们是如何工作的,这一点非常重要

这是双向的:Java 运行时提供的功能(我怀疑,虽然我可能错了)在 Ruby 中不可用,并且会给您带来巨大的好处:

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

第 1 点和第 2 点不是不可逾越的障碍,我认为这里提到的其他相似之处将对您非常有利。哦,Scala 肯定很有趣!

于 2010-02-28T17:49:50.753 回答
7

我没有 Ruby 背景,不过,我也许可以帮助你。

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

  2. --

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

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

于 2010-02-28T15:15:25.147 回答
3

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

最明显:

  1. Java 有一个被称为“类型擦除”的严重错误功能。不幸的是,这种损坏也存在于 JVM 中。这尤其会影响使用泛型类型的编程——在 Ruby 和 Python 等动态类型语言中根本不会出现这个问题,但在静态类型语言中却非常严重。Scala 在解决这个问题方面做得很好,但是破坏的严重性意味着其中一些不可避免地会渗入 Scala。此外,Scala 中针对这个问题的一些修复(例如清单)是最近的和骇人听闻的,并且确实需要了解下面的内容。请注意,这个问题一开始可能不会影响您对 Scala 的理解,但是当您开始编写使用泛型类型的实际程序时,您会遇到它,

  2. 迟早您还会遇到与另一个 Java 错误特性相关的问题,即将类型划分为对象(类)与原始类型(整数、浮点数、布尔值)——尤其是原始类型的事实不是对象系统的一部分。Scala 实际上做得很棒,向您隐藏了这一点,但是了解 Java 在某些可能会很棘手的极端情况下所做的工作会很有帮助——尤其是涉及泛型类型,这主要是因为 # 中描述的类型擦除损坏。 1. (在使用数组、哈希表和类似的泛型类型而不是原语时,类型擦除还会导致性能受到重大影响;这是了解 Java 将有很大帮助的一个领域。)

  3. 错误#3——数组在Java中也被特殊地和非正交地处理。Scala 对此的隐藏不如原语那么无缝,但比类型擦除要好得多。隐藏机制有时会暴露出来(例如 ArrayWrapper 类型),这可能偶尔会导致问题——但毫无疑问,在实践中最大的问题还是泛型类型。

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

  5. 输入/输出。这实际上是一个库问题而不是语言问题。在大多数情况下,Scala 提供了自己的库,但 Scala 并没有真正的 I/O 库,因此您几乎别无选择,只能直接使用 Java 的 I/O 库。对于 Python 或 Ruby 程序员来说,这种转变有点痛苦,因为 Java 的 I/O 库又大又笨重,而且在执行简单任务(例如遍历文件中的所有行)时使用起来并不容易。

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

  1. 子进程调用,也有点大而且笨重
  2. 网络——但这总是有点痛苦
  3. 反射,即动态检查类上的方法和/或字段,或在编译时不知道名称时按名称动态调用方法。这是大多数人不需要处理的有些深奥的东西。显然 Scala 2.10 将拥有自己的反射库,但目前您必须使用 Java 反射 API,这意味着您需要相当多地了解 Scala 是如何转换为 Java 的。(谢天谢地,Scala 编译器有一个 -print 选项可以准确显示这种转换是如何发生的。)
于 2011-10-26T00:05:21.620 回答
1

回覆。要点1.不熟悉Java语言不一定是问题。第三方库在很大程度上无缝集成到 Scala 中。然而,对集合差异的一些认识可能是好的(例如,Scala 列表不是传统的 Java 列表,API 可能期望后者)。

继承的Java相关技能与Java平台相关。也就是说,您仍在使用执行类加载、垃圾收集、JIT 编译等的 JVM。因此,这方面的经验很有用。但完全没有必要。

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

于 2010-02-28T15:29:55.053 回答
1

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

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

3) Scala 编程不仅非常适合学习 Scala,它还是为数不多的任何语言的真正可读的计算机书籍之一。而且方便以后参考。

4) 我用过近十种不同的编程语言,从汇编语言到 Prolog,但 Scala 和 F# 是我用过的最有趣的两种编程语言——相差很大。(Scala 和 F# 非常相似,是两个不同生态系统——JVM 和 .NET 中“趋同进化”的一个例子。)

-尼尔

于 2011-10-26T01:14:09.287 回答