Scalatest Scalamock ведет себя по-разному с той же функцией, объявленной двумя способами

Если у меня есть черта Scala с двумя определенными функциями, одна определена с использованием только сигнатуры def foo : Int => String а другая функция объявлена ​​с параметром и типом возврата def bar(myInt : Int): String тогда я получаю другое поведение для этих методов.

import org.scalamock.scalatest.MockFactory
import org.scalatest.{Matchers, WordSpec}

class DefTest {

  trait DefTrait {
    def foo : Int => String
    def bar(myInt: Int) : String
  }

  class DefTest extends WordSpec with Matchers with MockFactory {
    val defStub = stub[DefTrait]

    defStub.bar _ when * returns "Works"
    defStub.foo _ when * return "nope"

  }
}

Подпись только не удалась

IntellJ говорит, что есть Too many arguments for method when а также expected: FunctionAdapter0[Boolean], actual: MatchAny,

SBT говорит:

type mismatch;
[error]  found   : org.scalamock.matchers.MatchAny
[error]  required: org.scalamock.function.FunctionAdapter0[Boolean]
[error]     defStub.foo _ when * returns "nope"
[error]                        ^

Это заставляет меня задуматься:

  1. В чем разница между этими двумя типами объявлений функций? Я думал, что они эквивалентны, и я, кажется, был в состоянии использовать их взаимозаменяемо до сих пор.
  2. Можно ли использовать определение функции подписи foo: Int => String с defStub.foo _ when 42 return "yay" синтаксис?

1 ответ

Решение

1. В чем разница между этими двумя типами объявлений функций?

За def foo : Int => String возвращает функцию высокого порядка без параметров принятия:

scala> :kind -v foo
scala.Function1's kind is F[-A1,+A2]
* -(-)-> * -(+)-> *
This is a type constructor: a 1st-order-kinded type.

и когда вы звоните foo(2)это равно foo.apply(2), apply Метод используется для выполнения функции.

За def bar(myInt: Int) : StringЭто метод, который принимает Int параметр.

2.Можно ли использовать определение функции подписи foo: Int => String с defStub.foo _, когда 42 возвращает синтаксис "yay"?

за def foo : Int => String это не приемный параметр, поэтому вы должны использовать when() для этого и возвращается тип Int => Stringтак что вы должны returns функция высокого порядка для этого метода. лайк:

defStub.foo _ when() returns((i: Int) => "nope")
Другие вопросы по тегам