如何解决构造函数参数在类和案例类中的处理方式不同吗?
在《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
都是公开的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。