Предисловие
Это часть 11 учебных пособий для начинающих программистов, попадающих в Scala. Другие посты находятся в этом блоге, и вы можете получить ссылки на эти и другие ресурсы на странице ссылок курса по компьютерной лингвистике, для которого я их создаю. Кроме того, вы можете найти эту и другие серии учебников на странице JCG Java Tutorials .
В этом руководстве рассказывается о создании приложений Scala с использованием SBT (Simple Build Tool). Это будет сделано в контексте пакета Scalabha , который я создал в первую очередь для моего курса «Введение в компьютерную лингвистику» . Некоторый вспомогательный код доступен в Scalabha для некоторых основных задач обработки естественного языка; наиболее актуальным на данный момент является код в Scalabha, который поддерживает домашнюю работу по помечению части речи для класса.
Предыдущее руководство показало, как код Scala может быть скомпилирован с помощью Scalac, а затем запущен с помощью Scala . Одна проблема, с которой мы столкнулись, заключается в том, что сгенерированные файлы классов засоряют рабочий каталог. Еще одна вещь, которую мы не обсуждали, это то, как можно создать большую систему модульным способом, который организует код и классы. Например, вы можете захотеть, чтобы код в разных каталогах генерировал классы, которые могут использоваться друг другом. Вы также можете захотеть включить классы из других библиотек в свой собственный код. Решения, которые мы обсудим для решения этих и других задач, — это системы сборки и пакеты.
Примечание . В этом руководстве предполагается, что вы используете какую-то версию Unix. Если вы работаете в Windows, вам следует рассмотреть возможность использования Cygwin, или вы можете выполнить двойную загрузку компьютера .
Примечание . В этом руководстве я предполагаю, что вы используете простой текстовый редактор для изменения файлов. Однако обратите внимание, что общие настройки, с которыми вы здесь работаете, могут использоваться в более мощных интегрированных средах разработки (IDE), таких как Eclipse, IntelliJ и NetBeans.
Настройка Скалабхи
Мы будем работать с SBT, который, пожалуй, самый популярный инструмент для сборки Scala. Упомянутый ранее инструментарий Scalabha использует SBT (версия 0.11.0), поэтому мы обсудим SBT в контексте Scalabha.
Первое, что вам нужно сделать, это загрузить Scalabha v0.1.1. Затем распакуйте файл, перейдите в каталог, в который он распакован, и перечислите содержимое каталога.
1
2
3
4
5
6
7
|
$ unzip scalabha-0.1.1-src.zip Archive: scalabha-0.1.1-src.zip <lots of output> $ cd scalabha-0.1.1 $ ls CHANGES.txt README build.sbt project LICENSE bin data src |
Вкратце, это содержание:
- README : текстовый файл, описывающий, как установить Scalabha на ваш компьютер.
- ЛИЦЕНЗИЯ : текстовый файл с лицензией Apache Software License 2.0.
- CHANGES.tx t: текстовый файл, описывающий изменения, внесенные для каждой версии (пока не очень).
- build.sbt : текстовый файл, содержащий инструкции для SBT о том, как собрать Scalabha
- bin : каталог, содержащий скрипт scalabha, который будет использоваться для запуска приложений, разработанных в системе сборки Scalabha, а также для запуска самого SBT. Он также содержит sbt-launch-0.11.0.jar, который представляет собой упакованный пакет классов SBT, который позволит нам очень легко использовать SBT. Есть некоторые другие файлы, которые являются скриптами Perl, которые имеют отношение к исследовательскому проекту и здесь не важны.
- data : каталог, содержащий данные с тегами части речи для английского и чешского языков, которые составляют основу для четвертого домашнего задания моего курса «Введение в компьютерную лингвистику» в этом семестре.
- project : каталог, содержащий один файл «plugins.sbt», который указывает SBT использовать плагин Assembly. Подробнее об этом позже.
- src : Самый важный каталог из всех — он содержит исходный код системы Scalabha, и там вы будете добавлять некоторый код во время работы с SBT.
На этом этапе вы должны прочитать README и настроить Scalabha на своем компьютере, включая сборку системы из исходного кода. В этом руководстве я приведу некоторые дополнительные сведения об использовании SBT и разработке кода с его помощью, дополняя и дополняя краткую информацию, приведенную в README.
Обратите внимание, что я буду ссылаться на переменную окружения SCALABHA_DIR ниже. Как указано в README, вы должны установить значение этой переменной там, где вы распаковали Scalabha. Например, для меня этот каталог ~ / devel / scalabha .
Совет : чтобы вам не приходилось устанавливать переменные окружения при каждом открытии новой оболочки, вы можете установить переменные окружения в своих файлах ~ / .profile (Mac, Cygwin) или ~ / .bash_aliases (Ubuntu) , Например, это в моих профилях на моих машинах.
1
2
|
export SCALABHA_DIR=$HOME /devel/scalabha export PATH=$PATH:$SCALABHA_DIR /bin |
SBT: простой инструмент сборки
Это не учебник по настройке проекта для использования SBT, а просто как использовать проект, уже настроенный для SBT. Итак, если вы ищете ресурсы по изучению SBT, то в основном вы найдете ресурсы, которые помогут программистам настроить SBT для своего проекта. Это, вероятно, смущает вас (Simple Build Tool больше не так прост, когда дело доходит до конфигурации). Использовать его очень просто, но опыт, которым обладают опытные программисты при использовании чего-то вроде SBT, вряд ли поможет. Здесь я намереваюсь дать основы, чтобы у вас была лучшая отправная точка для того, чтобы делать больше с SBT.
Во-первых, у Скалабхи есть небольшая слабость, которая может сбить с толку. Вместо того, чтобы пользователи сами устанавливали SBT, я поместил файл jar для SBT в каталог bin Scalabha; затем исполняемый файл scalabha (в том же каталоге) может взять его и использовать для запуска SBT. (Мои ученики и я таким образом настроили несколько проектов Scala / Java, включая Fogbow , Junto , Textgrounder и Updown .) Исполняемый файл scalabha имеет несколько целей выполнения (подробнее об этом позже), и одна из них это « построить ».
Когда вы вызываете цель сборки scalabha, она вызывает SBT и переводит вас в интерфейс SBT.
Сделайте следующее в своем SCALABHA_DIR .
1
2
3
4
|
$ scalabha build [info] Loading project definition from /Users/jbaldrid/devel/scalabha/project [info] Set current project to Scalabha ( in build file : /Users/jbaldrid/devel/scalabha/ ) > |
Вы могли бы добиться того же, загрузив SBT и запустив его в соответствии с инструкциями для SBT, но эта установка избавит вас от этой проблемы и гарантирует, что вы получите правильную версию SBT. Стоит просто указать, чтобы вы не думали, что Скалабха — это СБТ — СБТ полностью независим от Скалабхи.
Если у вас возникли проблемы с настройкой Scalabha, вы можете создать проблему на сайте Scalabha Bitbucket . Это просто означает, что я получу уведомление о том, что у вас есть некоторые проблемы, и, надеюсь, может помочь вам. И, возможно, у кого-то еще будет такая же проблема, и в этом случае вы можете найти свой ответ там. Большинство проблем с такого рода настройками связано с путаницей в отношении переменных среды и незнакомством с инструментами командной строки.
Компиляция с SBT
Давайте сейчас что-нибудь сделаем с SBT. Если вы успешно прошли через README, вы уже сделали то, что будет дальше, но я дам некоторые подробности о том, что происходит.
Поскольку вы, возможно, уже выполняли некоторые действия SBT как часть выполнения README, начните с выполнения « чистого » действия, чтобы мы оказались на одной странице.
1
2
|
> clean [success] Total time : 0 s, completed Oct 26, 2011 10:18:08 AM |
Затем запустите действие « compile ».
1
2
3
4
5
|
> compile [info] Updating { file : /Users/jbaldrid/devel/scalabha/ }default-86efd0... [info] Done updating. [info] Compiling 13 Scala sources to /Users/jbaldrid/devel/scalabha/target/classes ... [success] Total time : 9 s, completed Oct 26, 2011 10:18:19 AM |
В другой оболочке (что означает другое окно командной строки) перейдите к SCALABHA_DIR и перечислите содержимое каталога. Вы увидите, что были созданы две новые директории, lib_managed и target . Во-первых, когда другие библиотеки были загружены из Интернета и помещены в пространство проекта Scalabha, чтобы их можно было легко использовать — пока не беспокойтесь об этом. Во-вторых, куда делись файлы скомпилированного класса. Чтобы увидеть примеры файлов классов, сделайте следующее.
1
2
3
4
5
6
7
8
|
$ ls target /classes/opennlp/scalabha/postag/ BaselineTagger$$anonfun$tag$1.class BaselineTagger.class EnglishTagInfo$$anonfun$zipWithTag$1$1.class <... many more class files ...> RuleBasedTagger$$anonfun$tag$2.class RuleBasedTagger$$anonfun$tagWord$1.class RuleBasedTagger.class |
Они были сгенерированы из следующих исходных файлов.
1
2
|
$ ls src /main/scala/opennlp/scalabha/postag/ HmmTagger.scala PosTagger.scala |
Откройте PosTagger.scala в текстовом редакторе и посмотрите на него — вы увидите определения классов и объектов, которые были источниками для созданных файлов классов, в каталоге target / classes . По сути, SBT удобно обрабатывает разделение исходных файлов и файлов классов компиляции, так что у нас нет файлов классов, засоряющих наше рабочее пространство.
Как SBT узнает, где находятся файлы классов? Просто: он настроен на просмотр src / main / scala и компилирует каждый найденный файл .scala в этом каталоге. Вскоре вы начнете добавлять свои собственные файлы scala и сможете скомпилировать и запустить их как часть системы сборки Scalabha.
Затем в приглашении SBT вызовите действие « пакет ».
1
2
3
4
5
6
|
> package [info] Updating { file : /Users/jbaldrid/devel/scalabha/ }default-86efd0... [info] Done updating. [info] Packaging /Users/jbaldrid/devel/scalabha/target/scalabha-0 .1.1.jar ... [info] Done packaging. [success] Total time : 0 s, completed Oct 26, 2011 10:19:02 AM |
В командной строке, которую мы использовали для предварительного просмотра файлов, перечислите содержимое целевого каталога.
1
2
|
$ ls target/ cache classes scalabha-0.1.1.jar streams |
Вы только что создали scalabha-0.1.1.jar, бутылочную версию кода Scalabha, которую другие могут использовать в своих собственных библиотеках. Расширение «jar» расшифровывается как J ava Ar chive, и в основном это просто сжатая коллекция файлов классов.
Сама Scalabha использует другую вспомогательную библиотеку, созданную другими. Чтобы увидеть jar-файлы, используемые Scalabha в качестве вспомогательных библиотек, выполните следующие действия.
1
2
3
4
5
6
7
|
$ ls lib_managed /jars/ */*/*.jar lib_managed /jars/jline/jline/jline-0 .9.94.jar lib_managed /jars/junit/junit/junit-3 .8.1.jar lib_managed /jars/org .apache.commons /commons-lang3/commons-lang3-3 .0.1.jar lib_managed /jars/org .clapper /argot_2 .9.1 /argot_2 .9.1-0.3.5.jar lib_managed /jars/org .clapper /grizzled-scala_2 .9.1 /grizzled-scala_2 .9.1-1.0.8.jar lib_managed /jars/org .scalatest /scalatest_2 .9.0 /scalatest_2 .9.0-1.6.1.jar |
Конечно, вам все еще может быть интересно, что означает «использовать библиотеку» в вашем коде. Подробнее об этом после того, как мы поговорим о пакетах и начнем делать код самостоятельно.
пакеты
Проекты с большим количеством кода обычно организованы в пакет, который имеет набор подпакетов для частей базы кода, которые работают в тесном взаимодействии. На очень высоком уровне пакет — это просто способ гарантировать, что у нас есть уникальные полностью квалифицированные имена для классов. Например, в библиотеке Apache Commons Lang и в базовой библиотеке Scala есть класс Range . Если вы хотите использовать оба этих класса в одном и том же фрагменте кода, существует очевидная проблема конфликта имен. К счастью, они содержатся в пакетах, что позволяет нам обращаться к ним однозначно.
- Диапазон в библиотеке Apache Commons Lang — org.apache.commons.lang3.Range
- Диапазон в Scala — это scala.collection.immutable.Range
Поэтому, когда нам нужно использовать их вместе, мы все равно можем делать это без конфликтов. Вы уже видели некоторые имена пакетов, например, с java.lang.String и различием между scala.collection.mutable.Map и scala.collection.immutable.Map .
Чтобы увидеть пакеты и классы в Scalabha, запустите действие « doc » в SBT.
1
2
3
4
5
|
> doc [info] Generating API documentation for main sources... model contains 35 documentable templates [info] API documentation generation successful. [success] Total time : 7 s, completed Oct 26, 2011 10:22:23 AM |
Теперь укажите вашему браузеру файл target / api / index.html . Примечание: это означает «открыть файл», затем перейти к вашему SCALABHA_DIR, а затем к цели , затем к api , а затем выбрать index.html . Затем вы можете просматривать пакеты и классы в Scalabha. Например, посмотрите на HmmTagger , который находится в пакете opennlp.scalabha.postag , и вы увидите некоторые поля и функции, доступные этому классу.
Но, возможно, вы все еще задаетесь вопросом: как мне использовать эти пакеты и классы в моем коде? Мы делаем это с помощью операторов импорта . Мы исследуем это, создав собственный исходный код и скомпилировав его.
Создание и компиляция нового кода в SBT
Во-первых, мы начнем с простого приложения hello world, которое выполняется в контексте Scalabha и использует имя пакета. Настройтесь на это, выполнив следующий набор команд.
Теперь укажите вашему браузеру файл target / api / index.html . Примечание: это означает «открыть файл», затем перейти к вашему SCALABHA_DIR, а затем к цели, затем к api, а затем выбрать index.html. Затем вы можете просматривать пакеты и классы в Scalabha. Например, посмотрите на HmmTagger, который находится в пакете opennlp.scalabha.postag, и вы увидите некоторые поля и функции, доступные этому классу.
Но, возможно, вы все еще задаетесь вопросом: как мне использовать эти пакеты и классы в моем коде? Мы делаем это с помощью операторов импорта. Мы исследуем это, создав собственный исходный код и скомпилировав его.
Создание и компиляция нового кода в SBT
Во-первых, мы начнем с простого приложения hello world, которое выполняется в контексте Scalabha и использует имя пакета. Настройтесь на это, выполнив следующий набор команд.
1
2
3
|
$ cd $SCALABHA_DIR $ cd src /main/scala/opennlp/ $ mkdir bcomposes |
Затем с помощью текстового редактора создайте файл Hello.scala в каталоге src / main / scala / opennlp / bcomposes со следующим содержимым.
1
2
3
4
5
|
package opennlp.bcomposes object Hello { def main (args : Array[String]) = println( "Hello, world!" ) } |
Это похоже на объект hello world из предыдущего урока, но теперь у него есть дополнительная спецификация пакета, которая указывает, что его полное имя — opennlp.bcomposes.Hello .
Поскольку исходный код Hello.scala находится в подкаталоге каталога src / main / scala , теперь мы можем скомпилировать этот файл с помощью SBT. Обязательно сохраните Hello.scala , а затем вернитесь к приглашению SBT и введите « compile ».
1
2
3
|
> compile [info] Compiling 1 Scala source to /Users/jbaldrid/devel/scalabha/target/classes ... [success] Total time : 1 s, completed Oct 26, 2011 10:35:15 AM |
Обратите внимание, что он скомпилировал только один исходный код Scala: SBT уже скомпилировал другие исходные файлы в Scalabha, поэтому ему нужно было только скомпилировать новый, который вы только что сохранили.
После успешного создания и компиляции объекта opennlp.bcomposes.Hello мы можем запустить его. Исполняемый файл scalabha предоставляет цель « run », которая позволяет вам запускать любой код, созданный вами при настройке сборки Scalabha. В вашей оболочке введите следующее.
1
2
|
$ scalabha run opennlp.bcomposes.Hello Hello, world! |
На самом деле под капотом происходит множество вещей, которые гарантируют, что ваш новый класс будет включен в CLASSPATH и может использоваться таким образом (подробности см. В bin / scalabha ). Это значительно упростит для вас вещи. Короче говоря, правильная настройка CLASSPATH является одной из главных путаницы для новых разработчиков; Таким образом, вы можете продолжать двигаться, не беспокоясь о том, что по существу является проблемой сантехники.
Теперь предположим, что вы хотите изменить определение объекта Hello, чтобы также распечатать дополнительное сообщение, которое предоставляется в командной строке. Измените основной метод, чтобы он выглядел следующим образом.
1
2
3
4
|
def main (args : Array[String]) { println( "Hello, world!" ) println(args( 0 )) } |
Теперь сохраните его и попробуйте запустить.
1
2
|
$ scalabha run opennlp.bcomposes.Hello Goodbye Hello, world! |
Ой — это не сработало ?! Я просто вынудил вас прямо в общую путаницу для студентов, которые переходят от сценариев к компиляции: вы должны скомпилировать, прежде чем его можно будет использовать. Итак, вызовите compile в SBT и попробуйте эту команду снова.
1
2
3
|
$ scalabha run opennlp.bcomposes.Hello Goodbye Hello, world! Goodbye |
Чтобы увидеть, что происходит, когда вы генерируете синтаксическую ошибку в своем коде Scala, вернитесь к Hello.scala и измените первый оператор печати в методе main, чтобы в нем отсутствовала последняя цитата:
1
|
println("Hello, world!) |
Теперь вернитесь в SBT и скомпилируйте снова, чтобы увидеть любовное письмо, которое вы получите от компилятора Scala.
01
02
03
04
05
06
07
08
09
10
|
[info] Compiling 1 Scala source to /Users/jbaldrid/devel/scalabha/target/classes ... [error] /Users/jbaldrid/devel/scalabha/src/main/scala/opennlp/bcomposes/Hello .scala:5: unclosed string literal [error] println("Hello, world!) [error] ^ [error] /Users/jbaldrid/devel/scalabha/src/main/scala/opennlp/bcomposes/Hello .scala:7: ')' expected but '}' found. [error] } [error] ^ [error] two errors found [error] { file : /Users/jbaldrid/devel/scalabha/ }default-86efd0 /compile :compile: Compilation failed [error] Total time : 0 s, completed Oct 26, 2011 11:02:07 AM |
Попытка компиляции не удалась, и вы должны вернуться и исправить ее. Но пока не делай этого. В этом цикле записи-сохранения-компиляции есть удобный аспект SBT, который экономит ваше время и усилия: SBT позволяет запускать запускаемые действия, что означает, что SBT может автоматически выполнять действие, если есть изменения в том, что ему нужно. Действие компиляции заботится об исходном коде, поэтому оно может отслеживать изменения в файловой системе и автоматически перекомпилировать каждый раз, когда файл сохраняется. Для этого вы просто добавляете ~ перед действием.
Перед исправлением ошибки наберите ~ compile в SBT. Вы увидите то же сообщение об ошибке, что и раньше, но не беспокойтесь об этом. Последняя строка вывода из SBT скажет:
1
|
1. Waiting for source changes... (press enter to interrupt) |
Теперь снова зайдите в Hello.scala , добавьте цитату обратно и сохраните файл. Это запускает действие компиляции в SBT, так что вы увидите его автоматическую компиляцию с сообщением об успешном завершении.
1
2
3
|
[info] Compiling 1 Scala source to /Users/jbaldrid/devel/scalabha/target/classes ... [success] Total time : 0 s, completed Oct 26, 2011 11:02:49 AM 2. Waiting for source changes... (press enter to interrupt) |
Это хороший способ увидеть, компилируется ли ваш код, когда вы работаете над ним, без особых усилий. Каждый раз, когда вы сохраняете файл, он сообщит вам, если есть проблемы. И вы также сможете использовать цель запуска scalabha и знать, что при этом вы используете последнюю скомпилированную версию.
Когда вы разрабатываете свой код таким образом, вы можете вызвать действие « doc » в SBT, затем перезагрузить страницу index.html в вашем браузере, и она покажет вам обновленную документацию для созданных вами вещей. Попробуйте сейчас и посмотрите на пакет opennlp.bcomposes , который вы сейчас создали.
Создание кода, который использует существующие пакеты
Теперь мы можем вернуться к использованию кода из существующих пакетов. В прошлом (если вы прошли все эти учебные пособия), вы видели такие утверждения, как import scala.io.Source . Это происходит из стандартной библиотеки Scala, поэтому она всегда доступна для любой программы Scala. Однако вы также можете использовать классы, разработанные другими, аналогичным образом, если ваш CLASSPATH настроен так, чтобы они были доступны. Это именно то, что SBT делает для вас: все классы, которые определены в подкаталогах src / main / scala , готовы для вашего использования.
В качестве примера сохраните следующий код как src / main / scala / opennlp / bcomposes / TreeTest.scala . Он строит стандартное дерево структуры фраз для предложения «Я люблю кофе».
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package opennlp.bcomposes import opennlp.scalabha.model.{Node,Value} object TreeTest { def main (args : Array[String]) { val leaf 1 = Value( "I" ) val leaf 2 = Value( "like" ) val leaf 3 = Value( "coffee" ) val subjNpNode = Node( "NP" , List(leaf 1 )) val verbNode = Node( "V" , List(leaf 2 )) val objNpNode = Node( "NP" , List(leaf 3 )) val vpNode = Node( "VP" , List(verbNode, objNpNode)) val sentenceNode = Node( "S" , List(subjNpNode, vpNode)) println( "Printing the full tree:\n" + sentenceNode) println( "\nPrinting the children of the VP node:\n" + vpNode.children) println( "\nPrinting the yield of the full tree:\n" + sentenceNode.getTokens.mkString( " " )) println( "\nPrinting the yield of the VP node:\n" + vpNode.getTokens.mkString( " " )) } } |
Здесь есть несколько вещей, на которые стоит обратить внимание. Оператор import в верхней части — это то, что сообщает Scala полные имена пакетов для классов Node и Value . Вы могли бы эквивалентно написать это менее кратко следующим образом.
1
2
|
import opennlp.scalabha.model.Node import opennlp.scalabha.model.Value |
Или вы могли бы опустить оператор импорта и написать полные имена везде, например:
1
|
val leaf 1 = opennlp.scalabha.model.Value( "I" ) |
Во-вторых, Node и Value являются классами case . Мы обсудим это позже, но сейчас все, что вам нужно знать, это то, что для создания объекта классов Node или Value не обязательно использовать ключевое слово « new ».
В-третьих, операторы печати используют Scalabha API (интерфейс прикладного программирования) для выполнения полезных действий с объектами, таких как распечатка дерева, которое они описывают, печать результата узлов (слов, которые они охватывают) и так далее. Scaladoc, на который вы смотрели ранее для Scalabha, показывает вам эти функции, так что посмотрите, если вы еще этого не сделали.
Обратите внимание, что если вы оставили запущенную компиляцию включенной , SBT автоматически скомпилирует TreeTest.scala . В противном случае, убедитесь, что скомпилировали его самостоятельно. Затем запустите его.
01
02
03
04
05
06
07
08
09
10
11
12
|
$ scalabha run opennlp.bcomposes.TreeTest Printing the full tree: Node(S,List(Node(NP,List(Value(I))), Node(VP,List(Node(V,List(Value(like))), Node(NP,List(Value(coffee))))))) Printing the children of the VP node: List(Node(V,List(Value(like))), Node(NP,List(Value(coffee)))) Printing the yield of the full tree: I like coffee Printing the yield of the VP node: like coffee |
Сделайте и используйте свой собственный пакет
Импортируя нужные вам классы таким образом, вы можете добиться большего, используя их по мере необходимости. Любой класс в Scalabha или в библиотеках, которые включены в него, будет доступен для вас, включая любые классы, которые вы определяете. В качестве примера сделайте следующее.
1
2
3
|
$ cd $SCALABHA_DIR /src/main/scala/opennlp/bcomposes $ mkdir person $ mkdir music |
Теперь сохраните класс Person из предыдущего урока как Person.scala в каталоге person . Вот код снова (обратите внимание на добавление оператора пакета ).
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
package opennlp.bcomposes.person class Person ( val firstName : String, val lastName : String, val age : Int, val occupation : String ) { def fullName : String = firstName + " " + lastName def greet (formal : Boolean) : String = { if (formal) "Hello, my name is " + fullName + ". I'm a " + occupation + "." else "Hi, I'm " + firstName + "!" } } |
Теперь сохраните следующее как RadioheadGreeting.scala в каталоге музыки .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
package opennlp.bcomposes.music import opennlp.bcomposes.person.Person object RadioheadGreeting { def main (args : Array[String]) { val thomYorke = new Person( "Thom" , "Yorke" , 43 , "musician" ) val johnnyGreenwood = new Person( "Johnny" , "Greenwood" , 39 , "musician" ) val colinGreenwood = new Person( "Colin" , "Greenwood" , 41 , "musician" ) val edObrien = new Person( "Ed" , "O'Brien" , 42 , "musician" ) val philSelway = new Person( "Phil" , "Selway" , 44 , "musician" ) val radiohead = List(thomYorke, johnnyGreenwood, colinGreenwood, edObrien, philSelway) radiohead.foreach(bandmember = > println(bandmember.greet( false ))) } } |
Когда мы делали руководство по компиляции ранее, Person.scala и RadioheadGreeting.scala находились в одном каталоге, что позволяло последним знать о классе Person . Теперь, когда они находятся в отдельных пакетах, класс Person должен быть явно импортирован; как только вы это сделаете, вы можете кодировать объекты Person так же, как и раньше.
Наконец, чтобы запустить его, теперь мы должны указать полное имя пакета для RadioheadGreeting .
1
2
3
4
5
6
|
$ scalabha run opennlp.bcomposes.music.RadioheadGreeting Hi, I'm Thom! Hi, I'm Johnny! Hi, I'm Colin! Hi, I'm Ed! Hi, I'm Phil! |
Примечание об именах пакетов и их связи с каталогами
Имена пакетов делаются уникальными в соответствии с определенными соглашениями, которые обычно гарантируют, что вы не столкнетесь. Например, мы используем opennlp.scalabha и opennlp.b , которые, как я знаю, уникальны. Довольно часто эти имена будут включать полные интернет-домены, наоборот, как org.apache.commons и com.cloudera.crunch . По соглашению мы помещаем исходные файлы в пакетах (и подпакетах) в структуры каталогов, которые отражают имена. Так, например, opennlp.bcomposes.music.RadioheadGreeting находится в каталоге src / main / scala / opennlp / bcomposes / music . Тем не менее, стоит отметить, что это не является жестким ограничением для Scala (как для Java).
Использование системы сборки намного шире, но на этом я должен закончить это обсуждение, надеясь, что этого достаточно, чтобы изложить основные понятия и позволить моим студентам выполнить домашнюю работу по тегированию части речи. и использовать пакет opennlp.scalabha.postag !
Ссылка: Первые шаги в Scala для начинающих программистов, часть 11 от нашего партнера по JCG Джейсона Болдриджа в блоге Bcomposes .
Статьи по Теме :
- Scala Tutorial — Scala REPL, выражения, переменные, основные типы, простые функции, сохранение и запуск программ, комментарии
- Scala Tutorial — кортежи, списки, методы для списков и строк
- Scala Tutorial — условное исполнение с блоками if-else и соответствием
- Scala Tutorial — итерация, для выражений, yield, map, filter, count
- Scala Tutorial — регулярные выражения, сопоставление
- Scala Tutorial — регулярные выражения, сопоставления и замены с помощью API scala.util.matching
- Учебник по Scala — Карты, Наборы, groupBy, Параметры, Flatten, FlatMap
- Scala Tutorial — scala.io.Source, доступ к файлам, flatMap, изменяемые Карты
- Scala Tutorial — объекты, классы, наследование, черты, списки с несколькими связанными типами, применение
- Scala Tutorial — скриптинг, компиляция, основные методы, возвращаемые значения функций
- Scala Tutorial — блоки кода, стиль кодирования, замыкания, проект документации scala
- Веселье с функцией композиции в Scala
- Как Scala изменил мой взгляд на мой Java-код
- Тестирование с помощью Scala
- Вещи, которые должен знать каждый программист