1

Is it possible to initialize a class parameter with a function in Scala?

Example:

def square(x: Int) = x*x

class Foo(val x: Int = square(x))

This doesn't compile but I hope you get the idea.

4

4 に答える 4

4

あなたが達成しようとしていることを推測するのは難しいですが、試してみましょう:

class Foo private (val x: Int)

object Foo {
  def apply(x: Int) = new Foo(square(x))
}

REPL でこれを試す場合は、クラスとそのコンパニオン オブジェクトの両方を同時に入力する必要があることに注意してください (貼り付けモードで、 を介して:pa)。object Fooそうしないと、プライベート クラス コンストラクターにアクセスできなくなります。

これは、インスタンスを作成する前にsquare関数をパラメーターに適用します。xFoo

scala> Foo(3).x
res1: Int = 9
于 2013-01-29T18:00:16.100 に答える
3

(基本ケースを持たずに)xに基づいて計算しようとするため、これは不可能です。x次のことができます。

class Foo(_x: Int) {
  val x = square(_x)
}

println(new Foo(10).x) // 100


編集

これを一般化して、以下を変換する関数をクラスコンストラクターに暗黙的に渡すこともできますx

implicit val square = (x: Int) => x*x

class Foo(private val _x: Int)(implicit f: Int => Int) {
  val x = f(_x)
}

println(new Foo(10).x) // 100

残念ながら、スコープ()には別の暗黙的なものがあるため、これはそのままではコンパイルされません(Scala 2.9.2、2.10.0 Predef.conforms)。このあいまいさを克服する方法はわかりませんが、確かに可能であるはずです。

于 2013-01-29T15:50:14.523 に答える
1

ここにあります..関数でクラスを初期化できます!:)

  class Foo(f : Int => Int)

  def square(x : Int) = x*x                     

  val foo = new Foo(square)

または、おそらくこれを探しているに違いありません。

  class Foo(f : Int => Int, _p1 : Int){
   val p1 = f(_p1)
  }

  def square(x : Int) = x*x                       //> square: (x: Int)Int
  def add2(x : Int) = x+2                         //> add2: (x: Int)Int

  val fooSqr = new Foo(square,5)                  
  fooSqr.p1                                       //> res0: Int = 25

  val fooAdd2 =  new Foo(add2,5)                 
  fooAdd2.p1                                      //> res1: Int = 7
于 2013-01-29T17:39:14.930 に答える
0

一般に、デフォルト値 ( source )を定義するときに任意の式を使用できます。

x はおそらくその時点で宣言も初期化もされていないため、問題は初期化の右側で x を使用できないことです。

于 2013-01-29T15:59:51.363 に答える