【问题标题】:Questions about Scala from a Rubyist来自 Rubyist 的关于 Scala 的问题
【发布时间】:2011-01-22 00:38:36
【问题描述】:

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

我有几个问题:

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

  2. 差别有多大 与红宝石相比? (除了是 静态类型)它是否引入 很多新术语,或者我会 熟悉大部分语言 机制?

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

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

谢谢

【问题讨论】:

    标签: ruby scala scala-2.8


    【解决方案1】:

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

    Ruby Scala(大约!)

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

    你可能会错过的 Ruby 功能

    • method_missing
    • define_method 等

    你应该学习的 Scala 特性

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

    【讨论】:

    • 正则表达式:/Cats(.*)/ "Cats(.*)".r
    • Scala 2.9 将引入scala.Dynamic,类似于method_missing
    • 该死的Scala,你赢得了这个Rubyist的心! :) 看得越深,越显得壮丽。
    • 和提取器...你不想忘记提取器!
    【解决方案2】:

    这是我的看法:

    • 不懂Java也没关系。

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

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

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

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

    • 你没有提到你关注的是哪个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 问题的一个原因是,我喜欢为提出的问题制定解决方案。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        我没有 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 背景,这很有趣。

        【讨论】:

          【解决方案5】:

          这已经很晚了,但我在某种程度上同意 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. I/O。这实际上是一个库问题而不是语言问题。在大多数情况下,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 选项可以准确显示这种转换是如何发生的。)

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

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

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

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

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

              -尼尔

              【讨论】:

                猜你喜欢
                • 2021-02-17
                • 2011-08-28
                • 2011-03-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-12-10
                • 1970-01-01
                相关资源
                最近更新 更多