标签: scala-primary-constructor

scala构造函数参数默认为private val吗?

我已经试了:

class Foo(bar: Int)
Run Code Online (Sandbox Code Playgroud)

VS:

class Foo(private val bar: Int)
Run Code Online (Sandbox Code Playgroud)

而且他们似乎表现得一样,虽然我找不到任何地方说(bar: Int)扩大到(private val bar: Int)所以我的问题是,这些相同/相似吗?

在旁注中,我一直在尝试使用-Xprint:typer这些代码片段,除了第二行中的额外行之外,它们产生相同的代码.我该如何阅读额外的行?

..
class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val bar: Int = _;
  def <init>(bar: Int): this.Foo = {
    Foo.super.<init>();
    ()
  }
}
..


..
class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val bar: Int = _;
  <stable> <accessor> <paramaccessor> private def bar: Int = Foo.this.bar;
  def <init>(bar: Int): this.Foo = {
    Foo.super.<init>();
    ()
  }
}
..
Run Code Online (Sandbox Code Playgroud)

scala scala-primary-constructor

119
推荐指数
2
解决办法
3万
查看次数

如何在Scala中的主构造函数中定义局部var/val?

在Scala中,类的主构造函数没有显式主体,但是从类主体隐式定义.那么,如何区分字段和本地值(即构造函数方法的本地值)?

例如,请使用以下代码片段,这是"Scala中的编程"中的一些示例代码的修改形式:

class R(n: Int, d: Int) {
   private val g = myfunc
   val x = n / g
   val y = d / g
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,这将生成一个包含三个字段的类:私有"g",以及公共"x"和"y".但是,g值仅用于计算x和y字段,并且除了构造函数范围之外没有任何意义.

所以在这个(公认的人为的)例子中,你如何为这个构造函数定义局部值?

scala scala-primary-constructor

60
推荐指数
4
解决办法
6942
查看次数

抽象val而不是主构造函数参数

考虑这两个类以及创建实例的方式:

class Person1(val name: String)

val p1 = new Person1("John");
Run Code Online (Sandbox Code Playgroud)

和:

abstract class Person2 {
  val name: String
}

val p2 = new Person2 {
  val name = "John"
}
Run Code Online (Sandbox Code Playgroud)

为什么人们更喜欢后者(Person2)版本?每个这样的声明都会导致创建新的子类,而且代码稍微冗长且可读性较差,但是第二个习惯用法在ScalaProgramming中多次使用.直接领域有哪些优势?

scala scala-primary-constructor

8
推荐指数
1
解决办法
355
查看次数

主构造函数中的Scala局部变量

如何在Scala中我可以在主构造函数中定义局部变量?

我需要从Scala for the impatient书中解决这个练习:

编写一个具有主构造函数的Person,该构造函数接受包含第一个名称,空格和姓氏的字符串,例如new Person("Fred Smith").提供只读属性firstName和lastName.主构造函数参数应该是var,val还是plain参数?为什么?

现在我的解决方案看起来像这样:

class Person(firstLast: String) {
  private[this] val firstLastAsArr = firstLast.trim.split(" ")

  val firstName = firstLastAsArr (0)
  val lastName = firstLastAsArr (1)
}
Run Code Online (Sandbox Code Playgroud)

如何限制firstLastAsArr主要构造函数范围的变量可见性(现在它有类范围)?

scala scala-primary-constructor

3
推荐指数
1
解决办法
1024
查看次数

标签 统计

scala ×4

scala-primary-constructor ×4