我已经试了:
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中的编程"中的一些示例代码的修改形式:
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字段,并且除了构造函数范围之外没有任何意义.
所以在这个(公认的人为的)例子中,你如何为这个构造函数定义局部值?
考虑这两个类以及创建实例的方式:
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)版本?每个这样的声明都会导致创建新的子类,而且代码稍微冗长且可读性较差,但是第二个习惯用法在Scala的Programming中多次使用.直接领域有哪些优势?
如何在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主要构造函数范围的变量可见性(现在它有类范围)?