首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala:如何在伴生对象中定义构造函数参数的默认值?

Scala:如何在伴生对象中定义构造函数参数的默认值?
EN

Stack Overflow用户
提问于 2017-07-12 22:31:22
回答 1查看 240关注 0票数 2

以下Scala代码不能在Scala REPL 2.11.6中编译:

代码语言:javascript
复制
object Foo {
  val DefaultSize: Int = 10
}

class Foo(size: Int = Foo.DefaultSize)

编译错误为:

代码语言:javascript
复制
value DefaultSize is not a member of object Foo
class Foo(size: Int = Foo.DefaultSize)

使用Scala 2.11进行了测试。这特别奇怪,因为它完全遵循公认的答案(在2012年):Use method return value as default constructor parameter in Scala,它现在也不编译。那么,如何实现预期的行为呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 13:51:16

作为explained in Programming in Scala,这是因为Scala REPL为您键入的每个新语句创建了一个新的嵌套作用域。这意味着您的代码被解释为:

代码语言:javascript
复制
object Foo {
  val DefaultSize: Int = 10
}
{
  class Foo(size: Int = Foo.DefaultSize)
}

虽然the same book mentions认为类和它的伴生对象必须在同一个源文件中定义,但似乎它们还必须在同一个作用域中,因为does not compile with scalac上面的代码块。

我知道在REPL中有两种方法可以解决这个问题。正如其他人所提到的,您可以在定义类和伴生对象之前进入:paste模式。或者,您可以将它们放入相同的作用域中,例如,通过在对象中定义它们:

代码语言:javascript
复制
object My {
   object Foo {
     val DefaultSize: Int = 10
   }
   case class Foo(size: Int = Foo.DefaultSize)
}

现在,您可以按预期使用Foo

代码语言:javascript
复制
scala> new My.Foo()
res0: My.Foo = Foo(10)
scala> new My.Foo(20)
res1: My.Foo = Foo(20)

(为了在最后一个代码块中获得简明的class Foo结果,我将case class设为一个REPL。然而,答案在没有这种改变的情况下是有效的。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45060596

复制
相关文章

相似问题

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