scala> class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length); def getWidth ():Int = println (Width); }
<console>:11: error: type mismatch;
found : Unit
required: Int
class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length:Int); def getWidth ():Int = println (Width:Int); }
^
<console>:11: error: type mismatch;
found : Unit
required: Int
class Rectangle (Length: Int, Width: Int) {; def getLlength (): Int = println (Length:Int); def getWidth ():Int = println (Width:Int); }
^
3 に答える
どこが間違っているかはわかりますが、ここで何をしたいのかは完全には明らかではありません。
getLlength
(sic) メソッドが の型を返すように宣言しましたInt
。ただし、このメソッドの本体は単なるprintln
呼び出しであるため、この呼び出しの結果が返されます。 println
の戻り値の型がありUnit
ます (何も返さず、副作用のためにのみ実行されるため)。
したがって、メソッドはreturnと宣言さInt
れていますが、戻り値の型が になるように実装しましたUnit
。これが、コンパイル時エラーが発生する理由です。
メソッドで長さを返しますか? もしそうなら、あなたはLength
それを印刷するのではなく、ただ戻ってくるべきです. ただし、これを行うより良い方法は、Scala でコンストラクターのパラメーターを としてマークすることです。これによりval
、そのアクセサーが自動的に生成されます。
class Rectangle(val Length: Int, ...
Rectangle rect
これで、たとえばオブジェクトへの参照を持っている人なら誰でもrect.Length
、長さを取得するために呼び出すことができます。実際、これは、Java が使用するget Foo 規則よりも、Scala でフィールドおよびフィールドのようなプロパティにアクセスするための推奨される方法です。
誰かが名前付きパラメーターにアクセスできるようにする「コンテナー」クラスが本当に必要な場合は、case classesを検討してください。機能的に同等のクラスを次のように定義できます
case class Rectangle(length: Int, width: Int)
これにより、フィールド、 sensible toString()
、equals()
およびhashCode()
implementations の両方のアクセサー メソッドが自動的に生成されます。また、追加のボーナスとしてパターン マッチングも得られます。
主に/完全に単なるフィールドのバンドルであるクラスが必要な場合はいつでも、ケースクラスが出発点になるはずです。
同様に、Scala の変数は慣例により lowerCamelCase であることに注意してください。フィールド/コンストラクターのパラメーターを上位クラスの名前で (つまりLength
の代わりにlength
) 宣言すると、コードを読む人が驚くほど混乱するため、慣例に固執することで、自分自身と他のすべての人に有利になります。
エラー メッセージは、println の戻り値の型が Unit であることを示しているため、getLlength メソッドは println の結果を返すため、Unit を返します。getLlength の戻り値の型は Int である必要があると言ったため、これはエラーです。
getLlength メソッドで長さを出力したい場合は、おそらく戻り値の型を Unit に変更する必要があります (そして、名前をこれを明確にするものに変更します)。
getLlength メソッドで長さを返したい場合は、println を呼び出すのではなく、単に長さを返す必要があります。