2016-05-07 5 views
1

私はMartin Oderskyの "ScalaのFuncitonal Programming Principles"のコースラコースに従っています。 「どこでもオブジェクト」のそのweek4 4.2ビデオのために、私は自分のブールクラスを実装するための手順を実行しましたが、日食は、次のようないくつかのエラーを示していますScala self implemented Booleanがいくつかのエラーを表示します

package week4 

object Main{ 

    abstract class Boolean{ 

     def ifThenElse[T](e1: => T, e2: => T): T 

     def && (b2: => Boolean): Boolean = ifThenElse(b2,False) 
     def || (b2: => Boolean): Boolean = ifThenElse(True,b2) 
     def unary_!: Boolean    = ifThenElse(False,True) //error1 

     def == (b2: Boolean): Boolean = ifThenElse(b2, b2.unary_!) //error2 
     def != (b2: Boolean): Boolean = ifThenElse(b2.unary_!, b2) //error3 
    } 

    object True extends Boolean{ 
     def ifThenElse[T](e1: => T, e2: => T): T = e1 
    } 

    object False extends Boolean{ 
     def ifThenElse[T](e1: => T, e2: => T): T = e2 
    } 

    def main(args: Array[String]) { 
     println("Hello, world!2") 
     True.ifThenElse(println("True"), println("Flase")) 
    } 
} 

ERROR1:見つかった識別子が期待=を。

ERROR2:この行で

複数のマーカー

  • 単純な式の違法開始
  • による呼び出し名パラメータ作成():単項=> B2
  • 値!この行で

    複数のマーカー

    • コールバイ名パラメータ作成():week4.Main.Boolean

    error3のメンバーではない=> B2

  • 値単項!は、週のメンバーではありません。メイン.Boolean

これはどうして起こるのでしょうか?

+0

は、あなたのScalaの自己は、あなたの毎日のコーダの自己と異なるです? –

答えて

4

あなたは(スペースの有無にかかわらず)、括弧を使用することができますコメントでhezamuで指摘したようにあなただけの、unary_!。あるいは:

def unary_! : Boolean    = ifThenElse(False,True) 

の間のスペースを必要とする

def unary_!(): Boolean    = ifThenElse(False,True) 

このここに該当しないのは、there is a convention in Scala that parentheses on a no-args method indicate that it has side effectsです。

戻り値の型はコンパイラによって推論することができる第三の選択肢は、(この例の場合のように)完全に入力し、リターンを省略することである。

def unary_! = ifThenElse(False, True) 
+1

また、スペースの代わりにかっこを使用することもできます。少なくとも私自身のために、それを少し読めるようにします。 'def unary _!():Boolean = ifThenElse(False、True)// error1' – hezamu

+0

これは愚かなエラーです。あなたの答えがありがとうと、私はhezamuの提案が「ベストプラクティス」の1つだと思います。 – Johnson

+0

ここにはやや関連するパズルがあります。 http://scalapuzzlers.com/#pzzlr-060 –

関連する問題