Scala中类参数的val是什么?

时间:2016-02-26 02:37:58

标签: scala

我有时会看到类似下面的内容。

class Test(val str: String){
}

我用val编写了一些示例代码,但我发现共同声明与val的方式没有任何区别。

他们之间有什么区别? 什么时候应该使用?

2 个答案:

答案 0 :(得分:6)

如果您添加// 'name' is a val class Person(val name: String) val p = new Person("Alvin Alexander") p.name // String = Alvin Alexander p.name = "Fred Flintstone" // error: reassignment to val // 'name' is neither var or val class Person(name: String) val p = new Person("Alvin Alexander") p.name // error: value name is not a member of Person ,您的变量将在课堂外显示。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:padding="2dp"
              android:background="@drawable/cell_background">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="15dp"
        android:text="New Text"
        android:gravity="center"
        android:background="@color/white"
        android:id="@+id/textView"/>

</LinearLayout>

代码取自http://alvinalexander.com/scala/scala-class-examples-constructors-case-classes-parameters

更多信息scala class constructor parameters

答案 1 :(得分:2)

通过添加@ EntryLevelDev的答案,您可以使用javap查看实际发生的情况。

1.scala

class Test(val str: String){
}

步骤1。 scalac 1.scala

步骤2。 javap测试

编译自&#34; 1.scala&#34;

public class Test {
  public java.lang.String str();
  public Test(java.lang.String);
}

2.scala:

class Test2(str: String){
    }

步骤1。 scalac 2.scala

步骤2。 javap Test2

编译自&#34; 1.scala&#34;

public class Test1 {
  public Test1(java.lang.String);
}

因此,当您添加val时,scala会根据参数的名称生成一个方法,并且会公开,因此可以从外部看到。