Scala Mock Syntax (класс _). Ожидается смысл?

Новичок в Scala, искал повсюду разъяснения по некоторому синтаксису ScalaMock. Согласно этому руководству, я продолжаю видеть следующую общую схему тестирования:

(myClass.myMethod _).expects()

Что именно здесь происходит? Какую функцию выполняет класс / метод / пространство / подчеркивание? Как компилятор относится к этому?

1 ответ

Решение

Добавленный _ вызывает преобразование метода в функцию.

Чтобы понять, почему это необходимо, давайте попробуем пересобрать крошечный фрагмент Scalamock, а именно: expects метод. expects Кажется, что метод вызывается на методах объектов, на которые наносят удар. Но методы / функции не имеют expects метод для начала. Поэтому мы должны использовать шаблон pimp my library для присоединения метода expects к функциям. Мы могли бы сделать что-то вроде этого:

implicit class ExpectsOp[A, B](f: A => B) {
  def expects(a: A): Unit = println("it compiles, ship it...")
}

Теперь давайте определим класс Bar с методом baz:

class Bar {
  def baz(i: Int): Int = i * i
}

а также пример Bar:

val bar = new Bar

Посмотрим, что произойдет, если вы попытаетесь вызвать expects на bar.baz:

(bar.baz).expects(42)

ошибка: отсутствует список аргументов для метода baz в классе Bar. Неприменяемые методы преобразуются в функции только тогда, когда ожидается тип функции. Вы можете сделать это преобразование явным, написав baz _ или же baz(_) вместо baz,

Таким образом, это не работает без явного преобразования в функцию, и мы должны принудительно выполнить это преобразование, добавив _:

(bar.baz _).expects(42) // prints: "it compiles, ship it..."
Другие вопросы по тегам