Scala中类参数声明之间的区别

模式查找器

有人可以帮助我理解以下两个声明吗?

class Person1(name: String, id: Int) { }
class Person2(val name: String, val id: Int) { }
val p1 = new Person1("personOne", 1)
val p2 = new Person2("personTwo", 2)
println(p1.name) // ERROR
println(p2.name) // OK!!

我知道默认情况下参数是val为什么第一个p1能够返回数据p2却不能做同样的事情

尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

从Scala规范正式开始:

形式值参数的范围包括所有后续参数部分和模板t。但是,形式值参数可能不构成任何父类或类模板t成员的类型的一部分。定义两个具有相同名称的形式值参数是非法的。

参数部分和模板t基本上描述了整个类范围。

在Scala的JVM实现上,当您在Scala中创建一个类并且不指定val关键字时,编译器会将字段范围设置为,private[this]并且不会为外部可见性创建匹配方法。含义(感谢@Duelist的用语),这些值仅在封闭类的范围内(这包括类方法和任何惰性字段),仅此而已:

class Person1 extends scala.AnyRef {
  <paramaccessor> private[this] val name: String = _;
  <paramaccessor> private[this] val id: Int = _;
  def <init>(name: String, id: Int): yuval.tests.Person1 = {
    Person1.super.<init>();
    ()
  };
  <empty>
};

当您添加val关键字时:

class Person1 extends scala.AnyRef {
  <paramaccessor> private[this] val name: String = _;
  <stable> <accessor> <paramaccessor> def name: String = Person1.this.name;
  <paramaccessor> private[this] val id: Int = _;
  <stable> <accessor> <paramaccessor> def id: Int = Person1.this.id;
  def <init>(name: String, id: Int): yuval.tests.Person1 = {
    Person1.super.<init>();
    ()
  };
  <empty>
};

将Adef添加到字段中,使它们在封闭类的外部可见,因此可以在使用现场看到。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Scala中对象和类之间的区别

#include .h和仅声明A类之间的区别;在C ++中

机器学习中参数,特征和类之间的区别

参数中的前向声明与“常规”前向声明之间的区别

在声明末尾或在主体中声明结构或类的实例之间的区别?

2个JUnit声明类之间的区别

类对象方法声明之间的区别React?

类中的javascript中的两种类型的函数声明之间的区别?

Scala中&和&&之间的区别?

Scala中=>和->之间的区别

Dockerfile中的VOLUME声明与-v作为docker run参数之间的区别

在React中,在render(){return()}与类扩展component {render(){}}之间声明'const'或'let'有什么区别?

Scala类声明中的private修饰符位置有什么区别?

在SQL Server中声明变量之间的区别

在iOS Swift中声明变量之间的区别?

Java中参数与参数之间的区别

JS类:类声明中的ES6 myFunc(){..}和ES5 myFunc = function(){...}之间的区别

python:init方法和类内声明之间的区别?

在.h文件中的类中声明静态变量和.cpp文件中的“全局”变量之间有什么区别?

Scala 中类型构造函数和参数化类型边界之间的区别

Scala的案例类和类之间有什么区别?

Scala(和Java)中的类和类型之间有什么区别?

Scala中具有隐式函数的转换与隐式类之间的区别

Scala在类中而不是在伴随对象上定义方法之间有什么区别

Intellij-idea中的scala类,脚本和工作表之间有什么区别?

在JavaScript中的函数参数中声明类

常量声明之间的区别

声明变量之间的区别

ArrayList声明之间的区别