Синтаксис черты Скала
536 просмотра
1 ответ
Я читаю книгу Одерского, и есть пример таблицы с следующей частью кода:
package org.stairwaybook.scells
trait Arithmetic { this: Evaluator =>
operations += (
"add" -> { case List(x, y) => x + y },
"sub" -> { case List(x, y) => x - y },
"div" -> { case List(x, y) => x / y },
"mul" -> { case List(x, y) => x * y },
"mod" -> { case List(x, y) => x % y },
"sum" -> { xs => (0.0 /: xs)(_ + _) },
"prod" -> { xs => (1.0 /: xs)(_ * _) }
)
}
что означает «this: Evaluator»? Может ли кто-нибудь помочь понять эту черту? Как я вижу, это определяет различные операции, которые являются функциями, но я не вижу общей картины ...
Автор: HamoriZ Источник Размещён: 12.11.2019 09:07Ответы (1)
11 плюса
Что вы видите здесь
this:Evaluator =>
это использование типа self для черты. Это в основном заставляет класс, который собирается смешивать арифметику черт, также смешивать оценщик черт.
Если вы попытаетесь создать класс, такой как следующий:
class ArithmeticClass extends Arithmetic
вы получите ошибку времени компиляции, а если попытаетесь сделать:
class ArithmeticClass extends Arithmetic with Evaluator
это сработает. Как видите, класс Arithmetic модифицирует что-то для операций, что, вероятно, является набором, определенным в признаке Evaluator.
Обратите внимание, что self-типы позволяют вам создать более чистую иерархию классов по сравнению с простым наследованием:
Если вы используете собственные типы, вы можете подумать о чем-то вроде следующего:
trait Evaluator { def runEvaluation : Int }
trait Arithmetic { self: Evaluator => def evaluate: Int = runEvaluation }
trait NullEvaluator extends Evaluator { def runEvaluation: Int = 0 }
class MyClass1 extends Arithmetic with Evaluator {... concrete methods .... }
class MyClass2 extends Arithmetic with NullEvaluator { ....concrete methods ..... }
Так что типы самости позволяют вам выражать нечто отличное от наследования.
Автор: Edmondo1984 Размещён: 18.07.2012 06:53Вопросы из категории :
- scala Есть ли реальный опыт использования программной транзакционной памяти?
- scala Преобразование коллекции Java в коллекцию Scala
- scala Что означает один апостроф в Scala?
- scala Самый масштабируемый веб-стек для высокопроизводительного приложения Flash / Flex / AIR?
- scala Разбиение макета Scala на инфиксном операторе
- scala Как мне обойти стирание типа на Scala? Или, почему я не могу получить параметр типа моих коллекций?
- scala Перегрузка конструктора Scala?
- scala Scala-эквивалент Java java.lang.Class <T> Object
- scala Синтаксис Скала точка (или его отсутствие)
- scala Предпочтительный способ создания списка Scala
- scala Прочитать весь файл в Scala?
- scala Увеличить размер кучи JVM для Scala?
- scala Какие веб-фреймворки Scala доступны?
- scala Использование операторов сравнения в системе сопоставления с образцом Scala
- scala Разница между объектом и классом в Scala
- scala Как разрешить java.nio.charset.UnmappableCharacterException в Scala 2.8.0?
- scala В чем разница между определениями var и val в Scala?
- scala Как вы определяете тип для функции в Scala?
- scala Как преобразовать X => Option [R] в PartialFunction [X, R]
- scala Возможно ли использовать Spring MVC с Groovy или Scala?