1

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

例子:

def square(x: Int) = x*x

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

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

4

4 回答 4

4

很难猜出您要达到的目标,但让我试一试:

class Foo private (val x: Int)

object Foo {
  def apply(x: Int) = new Foo(square(x))
}

请注意,如果您在 REPL 中尝试此操作,则必须同时输入类及其伴随对象(在粘贴模式下,通过:pa),否则object Foo将无法访问私有类构造函数。

这在创建实例之前将square函数应用于参数:xFoo

scala> Foo(3).x
res1: Int = 9
于 2013-01-29T18:00:16.100 回答
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)中还有另一个隐式。我不知道如何克服这种歧义,但它肯定是可能的。

于 2013-01-29T15:50:14.523 回答
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
于 2013-01-29T17:39:14.930 回答
0

通常,您可以在定义默认值 ( source )时使用任意表达式。

您的问题是您不能在初始化的右侧使用 x ,因为此时 x 可能既没有声明也没有初始化。

于 2013-01-29T15:59:51.363 回答