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.
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.
あなたが達成しようとしていることを推測するのは難しいですが、試してみましょう:
class Foo private (val x: Int)
object Foo {
def apply(x: Int) = new Foo(square(x))
}
REPL でこれを試す場合は、クラスとそのコンパニオン オブジェクトの両方を同時に入力する必要があることに注意してください (貼り付けモードで、 を介して:pa
)。object Foo
そうしないと、プライベート クラス コンストラクターにアクセスできなくなります。
これは、インスタンスを作成する前にsquare
関数をパラメーターに適用します。x
Foo
scala> Foo(3).x
res1: Int = 9
(基本ケースを持たずに)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
)。このあいまいさを克服する方法はわかりませんが、確かに可能であるはずです。
ここにあります..関数でクラスを初期化できます!:)
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
一般に、デフォルト値 ( source )を定義するときに任意の式を使用できます。
x はおそらくその時点で宣言も初期化もされていないため、問題は初期化の右側で x を使用できないことです。