代码之家  ›  专栏  ›  技术社区  ›  Joel

缺少第三方库是否会妨碍您使用Scala?

  •  3
  • Joel  · 技术社区  · 16 年前

    前几天我开始学Scala。至于语言本身,我觉得它很棒,一点问题都没有。为了帮助我的学习过程,我给自己设置了一个任务,从HTML页面下载、解析和索引文本。

    在做上述工作时,我发现自己一直在挖掘现有的Java库。我发现我必须使用Java库来:

    2) 解析HTML(TagSoup-因为普通的XML解析器不会处理格式最差的HTML)

    3) 索引文本(Lucene)

    考虑到我不得不依赖Java库来完成大量繁重的工作,我不禁怀疑,除了作为学习练习之外,是否值得我从使用Scala开始。这在一定程度上是由于在两者之间进行映射需要付出额外的精力,例如,字节[]的Scala类型是什么并不直观,因为一切都是Scala中的一个对象。正是这种额外的心理处理,让这个过程显得有些笨拙。

    还有人认为第三方库(与Java相比)的减少是在商业项目中使用Scala的障碍吗?

    如果您可以调用现有的Java库,那么这有什么关系呢?或者必须在一个代码库中跨两种不同的语言会让它变得更加困难吗?

    3 回复  |  直到 16 年前
        1
  •  5
  •   Magnus    16 年前

    Pimp my Library

    每当Java库的接口在Scala中有点麻烦时,这是一种使它更方便、代码更优雅的好方法。这里有一个非常简单的例子。我想在代码中一直使用scalaxml漂亮的打印机来返回格式良好的XML。这是正常的方法:

    class Service {
    val pp = new scala.xml.PrettyPrinter(80,2)
    def content = 
      pp.format(<foo><bar>{something()}</bar></foo>)
    }
    

    然而,因为我一直这样做,我把这个添加到我的包

    import scala.xml.Elem
    
    object PrettyXml {
      val pp = new scala.xml.PrettyPrinter(80,2)
    }
    
    trait PrettyXml {
      case class Formatted(xml:Elem) { 
        def pretty = PrettyXml.pp.format(xml) 
      }
      implicit def toFormatted(xml:Elem) = Formatted(xml)
    }
    

    现在我可以用

    class Service extends PrettyXML {
      val pp = new scala.xml.PrettyPrinter(80,2)
      def content = 
        <foo><bar>{something()}</bar></foo> pretty
    }
    

    如果我不想让它成为一种特性,我可以把PrettyXML放在一个package对象中。

        2
  •  12
  •   aioobe    16 年前

    我不太明白你的担心。Java库通常是一个.jar文件(压缩的.class文件集)。您希望Scala库是什么?嗯,这将是一组压缩的.class文件。这两种语言都编译成Java字节码!所以,回答你的问题:

    还有人认为第三方库(与Java相比)的减少是在商业项目中使用Scala的障碍吗?

    不,不是真的。

    如果您将java库看作一个编译过的.jar文件,则不必跨两种不同的语言。


    编辑:当然,Scala有一个非常丰富的类型系统,编译的类文件不能充分利用它。相反,大量可用的Java字节码格式的有用库可能使Scala 更多 比其他新的(现代的)语言更有吸引力。

        3
  •  4
  •   Dave Griffith    16 年前

    这其实并不像看上去那么愚蠢和误导的问题。关于Scala中的库的一些事实:

    1. 从Scala访问本机Java库要比从Java访问Java库稍微愉快一些,但只是稍微愉快一些。这里的问题是,本机Java库的级别远远低于用Scala编写的本机库或Java库的良好Scala包装器。原生Java库往往充斥着单一的方法接口(应该是函数)、轻描淡写的可空参数或返回(应该是选项)、不必要的并行类构造或“助手”(应该是特征)、手工编写的不太标准的迭代器,尝试一下要求块的资源管理(由于缺少闭包)和类型签名(尤其是Java-1.5之前的库),它们都是非常粗糙的。Scala程序员将Java库视为“完成工作所必需的”,而不是您真正期待的操作,这并不奇怪。
    2. 通过包装或pimping,实际上很容易获得一个Java本机库,并使其与Scala本机库一样令人愉快地使用。我希望大多数主要企业库的Scala适配器在短期内都能提供。