首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Scala中的函数初始化类参数

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

Stack Overflow用户
提问于 2013-01-29 23:35:53
回答 4查看 1.2K关注 0票数 1

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

示例:

代码语言:javascript
运行
复制
def square(x: Int) = x*x

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-30 02:00:16

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

代码语言:javascript
运行
复制
class Foo private (val x: Int)

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

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

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

代码语言:javascript
运行
复制
scala> Foo(3).x
res1: Int = 9
票数 4
EN

Stack Overflow用户

发布于 2013-01-29 23:50:15

这是不可能的,因为您尝试基于x (没有任何类型的基本情况)来计算x。您可以执行以下操作:

代码语言:javascript
运行
复制
class Foo(_x: Int) {
  val x = square(_x)
}

println(new Foo(10).x) // 100

编辑

您还可以对此进行泛化,并隐式地将一个函数传递给转换x的类构造函数

代码语言:javascript
运行
复制
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)。我不知道如何克服这种模棱两可的情况,但这肯定是可能的。

票数 3
EN

Stack Overflow用户

发布于 2013-01-30 01:39:15

这就是..。您可以使用函数!:)初始化一个类

代码语言:javascript
运行
复制
  class Foo(f : Int => Int)

  def square(x : Int) = x*x                     

  val foo = new Foo(square)

或许你一定是在找这个。

代码语言:javascript
运行
复制
  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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14586539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档