Ключевое слово типа Scala: как лучше всего использовать его в нескольких классах

Возвращаясь к Scala после написания заклинания на Haskell, я начал использовать ключевое слово type, чтобы сделать мои определения классов более удобочитаемыми, например:

type RestfulParams = Map[String, String]
def canonicalize(params: RestfulParams): String = { ... }

Проблема, с которой я столкнулся, заключается в том, что эти определения типов должны жить внутри класса или объекта - они не "первоклассные граждане", как в Haskell. Если я пытаюсь определить тип вне класса или объекта, я получаю компилятор expected class or object definition.

Моя проблема в том, как использовать эти типы в нескольких классах и объектах в пакете? То, что я сделал сейчас, кажется довольно уродливым:

object RestfulTypes { type RestfulParams = Map[String, String] etc }

А затем в другом файле класса:

import utils.{RestfulTypes => RT}
def get(resource: String, params: RT.RestfulParams): String = { ... }

Есть ли более хороший способ сделать это - и случайно гуру Scala считают, что это хорошо или плохо, что типы могут быть определены только внутри классов /объектов?

68 голосов | спросил Alex Dean 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 16 Sep 2011 11:09:07 +0400 2011, 11:09:07

3 ответа


0

Будет ли объекты пакетов работать на вас?

Из статьи:

  

До версии 2.8 в пакет можно было помещать только классы, черты и автономные объекты. Это, безусловно, самые распространенные определения, которые размещаются на верхнем уровне пакета, но Scala 2.8 не ограничивает вас только этими. Любое определение, которое вы можете поместить в класс, вы также можете поместить на верхний уровень пакета. Если у вас есть какой-то вспомогательный метод, который вы хотели бы использовать в рамках всего пакета, продолжайте и поместите его прямо на верхний уровень пакета. Для этого вы помещаете определения в объект пакета. Каждому пакету разрешено иметь один объект пакета. Любые определения, помещенные в объект пакета, считаются членами самого пакета.

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

ответил Ray Toal 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 16 Sep 2011 11:31:38 +0400 2011, 11:31:38
0

Я не уверен, что представляет собой милость в этом случае, но здесь есть два варианта:

Использование черты: ( Шаблон самоотверженной черты Scala )

trait RestfulTypes {
  type Params = Map[String,String]
  //...
}

object MyRestService extends RestService with RestfulTypes { /* ... */ }

Или просто импортируйте элементы объекта, эффективно используя его как пакет:

import util.RestfulTypes._
ответил Kim Stebel 16 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 16 Sep 2011 12:35:14 +0400 2011, 12:35:14
0

Вы можете использовать объект пакета и поместить туда объявление типа. При импорте этого пакета будет доступно определение типа.

Пример:

//package myType
package object myType {type mine = List[String]}

Обратите внимание, что объект пакета имеет то же имя, что и пакет, чтобы его можно было использовать без префикса объекта, т.е. myType.mine Если вы называете его другим именем, например:

//package myType
package object mainType {type mine = List[String]}

к нему можно получить доступ через mainType.mine при импорте «пакета»

для получения дополнительной информации: http://www.scala-lang.org/dOC /а>

ответил firephil 2 Maypm13 2013, 12:37:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132