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..."