2014-02-15 3 views
0

Я читал эту главу из Scala book, и он говорит, что:классы Дело в Scala свинг

нажатием кнопки создать событие, которое является экземпляром класса следующего случая:
case class ButtonClicked(source: Button)

Параметр класса case относится к нажатой кнопке. Как и во всех других событиях Scala Swing, этот класс событий содержится в пакете с именем scala.swing.event.

, а затем этот код, где Ъ фактическая кнопка, которая была нажата:

case ButtonClicked(b) => //code 

Я посмотрел на API и достаточно точно, был конструктор ButtonPressed:

new ButtonClicked(source: AbstractButton) 

Так что же происходит с событием мыши, например mousePressed? Вы обычно делаете это в коде:

1) case e: MousePressed => // code//

Означает ли это, что ниже, также может быть сделано? Они одинаковы?

2) case MousePressed(e: java.awt.event.MouseEvent)

В чем разница между 1 и 2?

EDIT:

Is 1) также случай класса? Вам не нужно передавать в него параметр?

+1

Примеры классов и соответствия шаблону являются общими (и широко используемыми) функциями Scala, они не специфичны для Scala Swing. Вы можете прочитать о них [в другой главе книги, которую вы указали) (http://www.artima.com/pins1ed/case-classes-and-pattern-matching.html) или, вероятно, лучше с точки зрения повышения на-главную, на главной странице [Scala doc] (http://docs.scala-lang.org/tutorials/tour/case-classes.html). –

+0

Спасибо.Мне интересно, но почему MousePressed - это класс case, когда вы пишете его как 1)? Вам не нужно передавать ему ничего, как в классе Case EditDone. – SonicProtein

+0

Хорошо, это на самом деле оправдывает ответ;). –

ответ

2

Быть a case class - это то, что это - Врожденное качество класса, не зависит от того, как вы его используете. Как вы можете видеть, MousePressed is defined as a case class (и это не подкласс Java's MouseEvent BTW, в случае возникновения путаницы), так что это всегда класс корпуса.

1 и 2 просто разные pattern matching expressions. Разница заключается в том, что:

  • вы можете использовать 1 для любого типа, так как вы в основном говорят «сопрягать все, что является экземпляром типа MousePressed»
  • для 2 вам нужно что-то под названием an extractor - он сообщает Scala, как разложить шаблон, который вы предоставили. В классах классов есть экстракторы, созданные из конструктора, определенные «бесплатно», и именно поэтому вы можете использовать 2 на MousePressed.

В заключение - прочитайте предыдущую главу on case classes and pattern matching - все станет понятнее.

+0

Спасибо, я прочитал эту тему, и теперь это стало яснее. Однако у меня есть еще один вопрос: поскольку для MousePressed есть два конструктора класса case, какой из них используется, когда нужно создать объект события MousePressed? – SonicProtein

+1

@SonicProtein Добро пожаловать :). Создано? В этом случае любой из классов case ведет себя как обычные классы. Если вы хотите спросить о совпадении - только конструктор по умолчанию (тот, который находится в «заголовке») получает «free' unapply »для класса case« обращение »- если автор класса не добавил пользовательскую логику экстрактора, он будет быть единственным. В любом случае вы можете проверить, посмотрев [исходный код] (https://github.com/scala/scala/blob/v2.10.0-RC5/src/swing/scala/swing/event/MouseEvent.scala# L1), или просто угадать - если вы ошиблись, компилятор будет жаловаться и предлагать правильный. –

+0

Пожалуйста, просмотрите второе изменение в вопросе, я все равно должен смутить все это:/ – SonicProtein

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