使用Scala中的函数初始化类参数

时间:2013-01-29 15:35:53

标签: scala

是否可以使用Scala中的函数初始化类参数?

示例:

def square(x: Int) = x*x

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

这不会编译,但我希望你明白这一点。

4 个答案:

答案 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可能既未声明也未初始化。