Подтвердить что ты не робот

Вопросы о Scala от рубиста

Недавно я изучал новый язык в свободное время, а Scala кажется очень привлекательным.

У меня есть несколько вопросов относительно этого:

  • Не зная, что Java навязывает Наша задача в изучении его? Это случится большой недостаток позже? (i.e Как часто люди полагаются на Библиотеки, специфичные для Java? )

  • Насколько велика разница по сравнению с Ruby? (Помимо того, что статически типизировано) Вводит ли это много новых терминов, или я буду знакомый с большинством языков механизмы?

  • Какие ресурсы вы бы порекомендовали? Я смотрю на Programming Scala и Beginning Scala книги

  • Хотя субъективный, Scala весело программировать?: P

Спасибо

4b9b3361

Ответ 1

Существует много концепций, разделяемых между Ruby и Scala. Прошло некоторое время с тех пор, как я закодировал Ruby, так что это не является исчерпывающим.

Ruby < == > Scala (Примерно!)

  • Микшины < == > Черты
  • Monkey Patching < == > Pimp My Library (Неявные преобразования в оболочку с дополнительными методами)
  • Proc/Closure < == > Функция/функция Literal
  • Duck Typing < == > Структурные типы
  • Последний аргумент в виде списка ошибок Proc < == > (см. Traversable # flatMap)
  • Перечислимый < == > Traversable
  • собирать < == > map
  • Вставить < == > foldLeft/foldRight
  • Symbol.toProc < == > Синтаксический сахар-заполнитель: people.map(_.name)
  • Согласование динамической типизации < == > Тип вывода
  • Nil < == > null, хотя опция предпочтительнее. ( Не Nil, который является пустым списком!)
  • Все это выражение < == > ditto
  • символы/хеши в качестве аргументов < == > Именованные и стандартные параметры
  • Singleton < == > object Foo {}
  • Everthing - это объект < == > Everthing - это тип или объект (включая функции)
  • No Primitives &lt == == Унифицированная система типа Any - это супертип для примитивов и объектов.
  • Все это сообщение < == > Операторы - это просто вызовы методов

Функции Ruby, которые вы могли бы пропустить

  • method_missing
  • define_method и т.д.

Scala Особенности, которые вы должны изучить

  • Соответствие шаблону
  • Неизменяемые классы, в частности классы case
  • Неявные представления и неявные параметры
  • Типы, типы и другие типы: Generics, Variance, Abstract Type Members
  • Унификация объектов и функций, особое значение методов apply и update.

Ответ 2

Вот мой пример:

  • Ничего, не зная Java.

  • Scala много опирается на библиотеки Java. Это не имеет значения. Возможно, вам будет трудно прочитать некоторые примеры, конечно, но недостаточно, чтобы быть помехой. С небольшим временем вы даже не заметите разницы между чтением документа API Java API и документами Scala API (ну, за исключением совершенно другого стиля новейшего скайдакока).

    Однако часто считается, что с JVM-средой известно. Если я могу посоветовать здесь, сначала избегайте Maven и используйте SBT в качестве инструмента построения. Это будет необязательно для небольших программ, но это облегчит работу с перегибами в Java-язычном мире. Как только вы захотите получить внешнюю библиотеку, узнайте SBT. При этом вам не придется иметь дело с каким-либо XML: вы пишете свои правила сборки в Scala.

  • Вам может быть трудно получить понятия и термины типа. Scala не только статически типизирован, но и имеет одну из самых мощных систем типов на неакадемических языках. Я уверен, что это будет источником большинства трудностей для вас. Другие понятия имеют разную терминологию, но вы быстро проведете параллели с Ruby.

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

  • Вы не указали, в каком программировании Scala у вас есть глаза. В Scala есть два, плюс одно программирование. Этот последний был написан, среди прочего, создателем языка и широко считается превосходной книгой, хотя, возможно, немного медленной. Один из программистов Scala был написан щебетать - Алекс Пейн - и экс-наставником-наставником Дин Уэмплер. Это тоже очень хорошая книга. Начало Scala было написано создателем лифта Дэвидом Поллаком, и люди говорили об этом. Я даже не слышал, чтобы кто-нибудь жаловался на любую из книг Scala.

    Одна из этих книг, безусловно, была бы полезна. Кроме того, поддержка по стеку переполнения для Scala вопросов довольно хороша - я прилагаю все усилия, чтобы это было так!:-) Там список рассылки scala -users, где можно получить ответы (пока люди не очень заняты), а там # scala IRC-канал на Freenode, где вы получите хорошую поддержку также. Иногда людей просто нет, но, если они есть, они вам помогут.

    Наконец, есть блоги. Лучшим для новичков является, вероятно, Ежедневно Scala. Вы можете найти много, многие другие Planet Scala. Среди них мой "Алгоритмически оспариваемый" , который в последнее время не очень любит, но я вернусь к нему.: -)

  • Scala восстановил удовольствие в программировании для меня. Конечно, я занимался Java, который является booooring, imho. Одна из причин, по которой я трачу так много времени на ответы на вопросы о переполнении стека, заключается в том, что мне нравится разрабатывать решения для задаваемых вопросов.

Ответ 3

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

  • Модель памяти Java и какие механизмы платформа предоставляет для concurrency. Я говорю о синхронизации, потоках и т.д.

  • Разница между примитивными типами (double, float и т.д.) и ссылочными типами (т.е. подклассы Object). scala предоставляет некоторые хорошие механизмы, чтобы скрыть это от разработчика, но очень важно, если писать код, который должен быть выполнен, знать, как эти работы

Это происходит в обоих направлениях: среда выполнения Java предоставляет функции, которые (я подозреваю, хотя я могу ошибаться) недоступны в Ruby и будут иметь огромное преимущество для вас:

  • Расширения управления (MBeans)
  • JConsole (для контроля времени работы памяти, процессора, отладки concurrency)
  • JVisualVM (для проверки исполнения кода для отладки памяти и проблем с производительностью)

Эти точки №1 и №2 не являются непреодолимыми препятствиями, и я думаю, что другие сходства, упомянутые здесь, будут сильно работать в вашу пользу. О, и scala, безусловно, очень весело!

Ответ 4

У меня нет фона Ruby, но, тем не менее, я мог бы помочь вам.

  • Я не знаю, что Java является недостатком, но это может помочь. На мой взгляд, Java-библиотеки используются относительно часто, но даже обученный Java-кодер не знает их всех, поэтому здесь нет недостатка. Вы узнаете некоторые части библиотеки Java, изучив Scala, потому что даже библиотеки Scala используют их.

  • -

  • Я начал с чтения Programming Scala и перевернулся, чтобы прочитать источник библиотеки Scala. Последний помог понять язык. И как всегда: код, код, код. Чтение без кодирования не приведет вас нигде, но я уверен, что вы уже это знаете.:-) Другими полезными ресурсами являются блоги, см. https://stackoverflow.com/questions/1445003/what-scala-blogs-do-you-regularly-follow для компиляции хороших блогов Scala.

  • Это! Как вы сказали, это очень субъективно. Но для меня, исходя из Java-фона, это очень весело.

Ответ 5

Это очень поздно, но я согласен с тем, что сказал oxbow_lakes. Я недавно перешел с Python на Scala, и зная, как работает Java, особенно ограничения Java в отношении общих типов, помогли мне понять некоторые аспекты Scala.

Наиболее заметно:

  • Java имеет ужасно ломаную ошибку, известную как "стирание типа". К сожалению, эта неисправность присутствует и в JVM. Это особенно сказывается на программировании с общими типами - проблема, которая просто не возникает вообще на динамически типизированных языках, таких как Ruby и Python, но очень велика в статически типизированных языках. Scala делает такую ​​же хорошую работу, как это может обойти это, но величина разлома означает, что часть из них неизбежно проникает в Scala. Кроме того, некоторые исправления в Scala для этой проблемы (например, манифесты) являются недавними и хакерскими, и действительно требуют понимания того, что происходит в нижней части. Обратите внимание, что эта проблема, вероятно, не повлияет на ваше понимание Scala, но вы столкнетесь с ней, когда начнете писать реальные программы, которые используют общие типы, поскольку есть вещи, которые вы попытаетесь сделать, t, и вы не будете знать, почему, пока/пока вы не поймете ограничения, вызванные стиранием типа.

  • Рано или поздно вы столкнетесь с проблемами, связанными с другой ошибкой Java, которая представляет собой разделение типов на объекты (классы) по сравнению с примитивными типами (ints, float, boolean) - и в частности, тот факт, что примитивные типы не являются частью объектной системы. Scala на самом деле делает удивительную работу, скрывающую это от вас, но может быть полезно узнать о том, что делает Java в некоторых случаях с углами, что в противном случае может быть сложным - в частности, с использованием родовых типов, в основном из-за описанной выше разлома стирания в 1. (Стирание типа также приводит к серьезному поражению производительности при использовании массивов, хеш-таблиц и подобных общих типов над примитивами, это одна из областей, где знание Java очень помогает.)

  • Misfeature # 3 - массивы также обрабатываются специально и не ортогонально в Java. Scala скрытие этого не так просто, как для примитивов, но намного лучше, чем для стирания типа. Скрывающий механизм иногда подвергается воздействию (например, типа ArrayWrapper), что может иногда приводить к проблемам, но самая большая проблема на практике, что неудивительно, снова связана с типичными типами.

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

  • I/O. На самом деле это проблема библиотеки, а не проблема языка. В большинстве случаев Scala предоставляет свои собственные библиотеки, но Scala на самом деле не имеет библиотеки ввода-вывода, поэтому у вас практически нет выбора, кроме как напрямую использовать библиотеку ввода-вывода Java. Для программиста Python или Ruby этот переход немного болезнен, поскольку библиотека ввода-вывода Java большая и громоздкая и не очень проста в использовании для выполнения простых задач, например. итерация по всем строкам в файле.

Обратите внимание, что помимо ввода-вывода вам также необходимо напрямую использовать библиотеки Java для других случаев, когда вы взаимодействуете с ОС или связанными с ними задачами, например. работая со временем и датами или получая переменные среды, но обычно это не так сложно понять. Другими основными библиотеками Java, которые могут потребоваться, являются

  • Подпроцессный вызов, также несколько большой и громоздкий
  • Сеть - но это всегда несколько больно.
  • Отражение, то есть динамическое исследование методов и/или полей в классе, или динамический вызов метода по имени, когда имя неизвестно во время компиляции. Это несколько эзотерический материал, с которым большинству людей не нужно иметь дело. По-видимому, Scala 2.10 будет иметь свою собственную библиотеку отражения, но в настоящее время вы должны использовать API отражения Java, а это значит, что вам нужно знать справедливую сумму о том, как Scala преобразуется в Java. (К счастью, есть опция -print для компилятора Scala, чтобы показать, как именно происходит это преобразование.)

Ответ 6

Re. точка 1. Не знакомая с Java, язык не обязательно является проблемой. Сторонние библиотеки полностью интегрируются в Scala. Однако некоторая осведомленность о различиях в коллекциях может быть хорошей (например, список Scala не является традиционным списком Java, и API могут ожидать последнего).

Связанные с Java навыки, связанные с Java, связаны с платформой Java. т.е. вы все еще работаете с JVM, который выполняет загрузку классов, сборку мусора, компиляцию JIT и т.д. Поэтому опыт в этом полезен. Но вовсе не нужно.

Обратите внимание, что Scala 2.8 неминуемо, и есть некоторые несовместимые изменения по. 2,7. Поэтому любая книга и т.д., Которую вы покупаете, должны знать о таких различиях.

Ответ 7

Это еще один поздний ответ, недавно пришедший к Scala, но я могу ответить 1, 3 и 4:

1) Я поместил большой, многогранный проект F # в Scala без использования библиотек Java или .NET. Таким образом, для многих проектов можно полностью использовать native Scala. Знание экосистемы Java было бы плюсом, но его можно было бы приобрести постепенно и после обучения Scala.

3) Программирование в Scala не только отлично подходит для изучения Scala, это одна из немногих действительно читаемых компьютерных книг на любом языке. И это удобно для последующей справки.

4) Я использовал около десятка различных языков программирования, от языков ассемблера до Prolog, но Scala и F # - два самых забавных языка программирования, которые я когда-либо использовал, - с большим отрывом. (Scala и F # очень похожи, пример "конвергентной эволюции" в двух разных экосистемах - JVM и .NET.)

-Neil