我正在进行斯卡拉研究的第三天。使用书"开始scala"。
作者使用一个例子来显示变量define与val var之间的差异而没有var val:
class Book(private val title: String) {
def printTitle(b: Book) {
println(b.title)
}
}
在控制台中:
scala> val book = new Book("Beginning Scala")
book: Book = Book@ea05be
scala> book.printTitle(new Book("Beginning Erlang"))
Beginning Erlang
这让我困惑的不是有/无val var,而是私有修饰符:
我不确定我是否理解私权,但如果scala想要标题作为私人字段,那么为什么它允许其他人从外部访问,我认为prinTitle不应该能够访问新书(" Beginning Erlang")的标题字段
答案 0 :(得分:8)
值title
是私有到类,而不是实例,因为方法printTitle
是类的成员,它可以访问其他的私有值实例
如果您希望title
成为该实例的私有,则可以使用private[this]
修饰符。
此外,private[package]
修饰符,其中package
是定义所在的包的名称,可以与包共享私有成员。例如
package com.sample.foo
class Book(private[foo] title: String)
包com.sample.foo
中的所有代码都可以访问
答案 1 :(得分:3)
title
是类Book
的私有字段。
在Java中,您可以这样写:
class Book {
private final String title;
Book(String title) {
this.title = title;
}
public void printTitle(b: Book) {
System.out.println(b.title)
}
}
我认为函数printTitle
可能有点令人困惑,因为在java和scala中它通常不会被实现为实例方法。
我会写这样的东西作为java中的静态方法。在scala中,我会将它放入伴侣对象(在混乱的scala newby中抛出另一个外星人概念;)):
class Book(private val title: String)
object Book {
def printTitle(b: Book) {
println(b.title)
}
}
因此,Book可以访问任何Book实例的私有字段。
如果您想限制对Book实例的标题访问,您可以编写如下内容:
class Book(private[this] val title: String) {
// no longer compiles
// def printTitle(b: Book) {
// println(b.title)
//}
def printTitle() {
println(title)
}
}