2017-06-28 7 views
0

2つの関数が定義されたScala特性を持つ場合は、def foo : Int => Stringというシグネチャのみを使用して定義し、これらのメソッドの動作Scalatest Scalamockは、同じ関数が2つの方法で宣言されたときの動作が異なります

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" 

    } 
} 

Signature only fail

IntellJはToo many arguments for method whenexpected: 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つのタイプの違いは何ですか?私はそれらが同等であると思っていました、そして、私は今までそれらを交換可能に使用することができたようです。
  2. defStub.foo _ when 42 return "yay"の構文で、署名関数の定義foo: Int => Stringを使用することはできますか?

答えて

4

1.これら2つのタイプの関数宣言の違いは何ですか?

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. 42の「yay」構文を返すときに、defStub.foo _で署名関数の定義foo:Int => Stringを使用することはできますか?あなたはこのためwhen()を使用する必要がありますので

def foo : Int => Stringにとっては、パラメータを受け入れていない、タイプがInt => Stringで返しますので、あなたこのメソッドの高階関数returns必要があります。 like:

defStub.foo _ when() returns((i: Int) => "nope") 
関連する問題