是否可以在Scala中使用函数来初始化类参数?
示例:
def square(x: Int) = x*x
class Foo(val x: Int = square(x))这不能编译,但我希望您能理解。
发布于 2013-01-30 02:00:16
很难猜到你想要实现什么,但让我试一试:
class Foo private (val x: Int)
object Foo {
def apply(x: Int) = new Foo(square(x))
}请注意,如果您在REPL中尝试这样做,则必须同时输入类及其伴生对象(在粘贴模式下,通过:pa),否则object Foo将无法访问私有类构造函数。
这将在创建Foo实例之前将square函数应用于参数x:
scala> Foo(3).x
res1: Int = 9发布于 2013-01-29 23:50:15
这是不可能的,因为您尝试基于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-30 01:39:15
这就是..。您可以使用函数!:)初始化一个类
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 = 7https://stackoverflow.com/questions/14586539
复制相似问题