{ case List(x, y) => x + y }, "sub" -> { case List(x," />

Синтаксис черты Скала

scala

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
Вопросы из категории :
32x32