2010-09-02 6 views
3

Я начал изучать Скалу на днях. Что касается самого языка, я думаю, что это фантастика, никаких проблем там вообще нет. Чтобы помочь в процессе обучения, я поставил себе задачу, загрузить, проанализировать и индексировать текст с HTML-страниц.Не хватает сторонних библиотек, препятствующих использованию Scala?

Выполняя вышеуказанное, я обнаружил, что постоянно перерастаю в существующие библиотеки Java. Я обнаружил, что я должен был использовать Java-библиотеки:

1) Открыть соединение - java.net.URL

2) Разбираем HTML (TagSoup - потому что обычный XML-парсер не будет обрабатывать наиболее плохо сформирован HTML)

3) Индекс текст (Lucene)

Учитывая, что я должен был полагаться на Java библиотеки, чтобы сделать довольно много тяжелой работы я оставил интересно, если она стоит мне с помощью Scala, чтобы начать с , за исключением обучения. Частично это было связано с тем, что для сопоставления между ними требовалось дополнительное умственное усилие, например, не интуитивно очевидно, что такое тип Scala байта [], поскольку все является объектом в Scala. Это дополнительная умственная обработка, которая может заставить процесс казаться немного неуклюжим.

Кто-нибудь еще думает, что меньше сторонних библиотек (по сравнению с Java) является препятствием для использования Scala в коммерческих проектах?

Если вы можете позвонить в существующие библиотеки Java, это даже имеет значение, или же нужно использовать два разных языка в кодовой базе, чтобы сделать его более сложным?

+0

аргументированный и простой глупый –

+1

Это не должно быть аргументацией, извинения, если это так. – Joel

ответ

5

Я рекомендую эту статью (и рисунок):

Pimp my Library

Всякий раз, когда библиотека Java имеет интерфейс, который только немного громоздким в Scala, это отличный способ, чтобы сделать его более удобным и ваш код более элегантный. Вот очень простой пример. Я хочу использовать довольно красивый принтер Scala XML в моем коде, чтобы возвращать хорошо отформатированный 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 в объект пакета.

12

Я не совсем понимаю вашу обеспокоенность. Библиотека Java обычно представляет собой файл .jar (сжатый набор файлов .class). Что бы вы ожидали от библиотеки Scala? Ну, это будет сжатый набор файлов .class. Оба языка скомпилированы в байт-код Java! Итак, чтобы ответить на ваши вопросы:

Кто-нибудь еще думает, что меньше сторонних библиотек (по сравнению с Java) является препятствием для использования Scala в коммерческих проектах?

Нет, не совсем.

Если вы можете назвать существующие библиотеки Java, это даже имеет значение, или нужно ли распространять два разных языка в кодовой базе, сделать это сложнее?

Если вы просматриваете java-библиотеку как скомпилированный файл .jar, вам не нужно будет охватывать два разных языка.


Редактировать: Конечно, Scala имеет очень богатую систему типов, в которой скомпилированные файлы классов не могут в полной мере использовать. Напротив, огромное количество полезных библиотек, доступных в формате байтового кода Java, вероятно, делает Scala более привлекательным, чем другие новые (прочитанные современные) языки.

+1

Во-первых, вам нужно сопоставить вызов Java API с эквивалентом Scala, например, не является интуитивно очевидным, что такое тип Scala для байта [], поскольку все это объект в Scala. Это дополнительная умственная обработка, которая может заставить процесс казаться немного неуклюжим. – Joel

+2

Я согласен с тем, что это не вызывает беспокойства (если что-то, что они сразу же предоставляют тысячи отличных библиотек Java, являются хорошим аргументом для использования Scala), но вызов в библиотеку Java не так хорош, как вызов библиотеки с включенной поддержкой Scala интерфейс. Таким образом, существует немного языковой барьер. – Thilo

+4

Тип Scala byte [] - Array [Byte]. Компилятор Scala может скомпилировать эти типы, как если бы они были примитивами, и только помещает их в них, чтобы запускать на них не-примитивные методы (например, 'filter'). – 2010-09-02 10:28:41

4

Это на самом деле не такой глупый и ошибочный вопрос, как кажется. Некоторые истины о библиотеках в Scala:

  1. Без обширной инфраструктуры библиотек Java было бы очень мало практических оснований для большинства людей использовать Scala. Scala - прекрасный язык с некоторыми удивительными особенностями, но если вам приходилось изобретать велосипед каждый раз, когда вам нужно было что-то большое, никто бы не стал беспокоиться.
  2. Доступ к родным библиотекам Java из Scala немного приятнее, чем доступ к Java-библиотекам с Java, но лишь незначительно. Проблема здесь в том, что собственные библиотеки Java значительно ниже уровня, чем библиотеки, написанные изначально в Scala или хорошие оболочки Scala библиотек Java. Собственные библиотеки Java, как правило, усеяны интерфейсами с одним методом (которые должны были быть функциями), легко документированными аргументами с нулевым значением или возвратом (это должен был быть вариант), ненужными конструкциями параллельного класса или «помощниками» (которые должны были быть чертами) ручные нестандартные итераторы, надежное управление ресурсами (из-за отсутствия закрытий) и подписи типов (в частности, с библиотеками до Java-1.5), которые смехотворно грубые. Неудивительно, что программисты Scala рассматривают библиотеки Java как «необходимые для выполнения работы», а не то, что вы на самом деле ожидаете манипулировать.
  3. С помощью обертывания или сутенерства на самом деле довольно легко взять родную библиотеку Java и сделать ее почти такой же радостной, как и в качестве родной библиотеки Scala. Я ожидаю, что просто великолепные адаптеры Scala для большинства основных корпоративных библиотек станут доступны в ближайшем будущем.
+0

Сверху вашей головы, можете ли вы перечислить некоторые популярные библиотеки Java с адаптерами Scala? Просто любопытно, что там ... –

+0

Ну, Scala-Swing, вероятно, самый очевидный, отправляющийся с дистрибутивом scala. Лифт и Акка оба поставляются с множеством встроенных адаптеров (redis, amqp, jta, jax-rs, couchdb, mongodb, cassandra). У меня лично есть обертки Scala для Ibatis, Freemarker, Quartz и Apache POI, которые я приобрел для внутреннего использования и, вероятно, в ближайшее время, возможно, польский и open-source. –

Смежные вопросы