问题描述
在《Programming in Scala 5th Edition》一书中,在第四章中提到,如果一个类是一个case类,我们可以通过以下方式创建类的对象:
scala> case class Person(name: String,age: Int)
// defined case class Person
scala> val p = Person("Sally",39)
val p: Person = Person(Sally,39)
我没有发现它与以下正常方式不同:
scala> class Person(name: String,age: Int)
// defined class Person
scala> val p = Person("Aviral",24)
val p: Person = Person@7f5fcfe9
我尝试在这两种情况下访问对象,但有所不同。当我将同一个类声明为 case
类时,我可以访问其成员:p.name
,p.age
而如果我尝试对 通常 执行相同的操作声明的类,我收到以下错误:
1 |p.name
|^^^^^^
|value name cannot be accessed as a member of (p : Person) from module class rs$line$3$.
就构造对象而言,这两种情况有何不同?
解决方法
正如 Tour Of Scala 或 Scala 3 book 所说
当您创建带有参数的案例类时,参数是公开的 const substitutions = {
"A": "E","B": "H","E": "D"
};
function transform(input) {
return input.replace(/./g,char => {
const upperChar = char.toLocaleUpperCase();
if (!(upperChar in substitutions))
return char;
const isUpper = char === upperChar;
const sub = substitutions[upperChar];
if (isUpper)
return sub.toLocaleUpperCase();
return sub.toLocaleLowerCase();
});
}
console.log(transform("Hello world!"));
console.log(transform("Beautiful!"));
console.log(transform("Boats Are Excellent ?"));
。
因此,在
val
与普通班级不同,case class Person(name: String,age: Int)
和 name
都是公开的。