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

使用Scala中的函数初始化类参数,scala,Scala,可以用Scala中的函数初始化类参数吗 例如: def square(x: Int) = x*x class Foo(val x: Int = square(x)) 这不会编译,但我希望您能理解。这是不可能的,因为您试图根据x计算x(没有任何基本情况)。您可以执行以下操作: class Foo(_x: Int) { val x = square(_x) } println(new Foo(10).x) // 100 编辑 您还可以对此进行推广,并隐式地将函数传递给转换x的类构造函数

可以用Scala中的函数初始化类参数吗

例如:

def square(x: Int) = x*x

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

这不会编译,但我希望您能理解。

这是不可能的,因为您试图根据
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.confirms
)。我不知道如何克服这种模糊性,但它肯定是可能的。

这是不可能的,因为您试图根据
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.confirms
)。我不知道如何克服这种模糊性,但这肯定是可能的。

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


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

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


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

在这里。。可以使用函数初始化类!:)

或者你一定在找这个

  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

给你。。可以使用函数初始化类!:)

或者你一定在找这个

  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

很难猜到你想要实现什么,但让我试一试:

class Foo private (val x: Int)

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

这将在创建
Foo
实例之前,将
square
函数应用于参数
x

scala> Foo(3).x
res1: Int = 9

很难猜到你想要实现什么,但让我试一试:

class Foo private (val x: Int)

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

这将在创建
Foo
实例之前,将
square
函数应用于参数
x

scala> Foo(3).x
res1: Int = 9

如果您使用这样的东西,它将起作用:
square(somethingothernx)
。但是您不能同时提供一个参数并使用它的默认值。如果您使用如下内容,它将起作用:
square(somethingothernx)
。但不能同时提供参数并使用其默认值