是否可以使用Scala中的函数初始化类参数?
示例:
def square(x: Int) = x*x
class Foo(val x: Int = square(x))
这不会编译,但我希望你明白这一点。
答案 0 :(得分:4)
很难猜到你想要实现的目标,但让我一起去吧:
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
答案 1 :(得分: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
)。我不知道如何克服这种模糊性,但它肯定是可能的。
答案 2 :(得分: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
答案 3 :(得分:0)
通常,您可以在定义默认值(source)时使用任意表达式。
您的问题是您不能在初始化的右侧使用x,因为x可能既未声明也未初始化。