0

必要なもの:

trait Base {
  import scala.math.{Pi=>mPi, cos=>msoc, sin=>msin}
  static val Pi : Float = mPi.toFloat
  static def cos(phi : Float) : Float = mcos(phi).toFloat
  static def sin(phi : Float) : Float = msin(phi).toFloat
  // ...
  // some useful functions
}
// children use float defined pi, cos and sin without additional boilerplate
class Child1 extends Base
// ...
class Child2 extends Base

それは明らかにうまくいきません。私が試したこと

trait Base {
  import Base._
  // some useful functions
}
object Base {
  // utility functions
  import scala.math.{Pi=>mPi, cos=>mcos, sin=>msin}
  val Pi : Float = mPi.toFloat
  def cos(phi : Float) : Float = mcos(phi).toFloat
  def sin(phi : Float) : Float = msin(phi).toFloat
}
class Child1 extends Base {
  // use sin and cos inside
}

また、コンパイラは、関数およびChild1について何もしないという点でエラーを出します。sincos

子孫に継承される基本クラスで静的メンバーを定義するにはどうすればよいですか?

4

2 に答える 2

1

特性を混合するか、オブジェクトからメンバーをインポートするかを選択するのはどうですか?

そして後者の方が良いと思います。

trait MathUtils { 
  def cos(phi : Float) : Float = ...
}
class Child1 extends MathUtils { cos(1.0F) }

また

object MathUtils { 
  def cos(phi : Float) : Float = ...
}
class Child1 { 
  import MathUtils._
  cos(1.0F)
}
于 2013-01-12T15:45:20.150 に答える
1

なぜあなたは静的な観点から考えているのですか?必要なのFloatは、定数の形式を返す引数リストのないメソッドを作成することだけです。

良くも悪くも、あなたが発見したように、継承されていないクラスまたはトレイトスコープでインポートします。

package rrs.scribble

trait   FloatMath
{
  import scala.math.{Pi => mPi, cos => mcos, sin => msin}

  def Pi: Float = mPi.toFloat
  def cos(phi: Float): Float = mcos(phi).toFloat
  def sin(phi: Float): Float = msin(phi).toFloat
}

object  FM1
extends FloatMath
{
  val twoPi = 2.0f * Pi
}

REPL では:

scala> import rrs.scribble.FM1._
import rrs.scribble.FM1._

scala> twoPi
res0: Float = 6.2831855

scala> cos(twoPi)
res1: Float = 1.0

Piご覧のとおり、twoPi、 、 などの静的型cosはすべてFloatであり、 ではありませんDouble

于 2013-01-12T17:32:22.133 に答える