是否可以在 Scala 中使用函数初始化类参数?
例子:
def square(x: Int) = x*x
class Foo(val x: Int = square(x))
这不会编译,但我希望你明白这一点。
是否可以在 Scala 中使用函数初始化类参数?
例子:
def square(x: Int) = x*x
class Foo(val x: Int = square(x))
这不会编译,但我希望你明白这一点。
很难猜出您要达到的目标,但让我试一试:
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 可能既没有声明也没有初始化。