3 回答

TA貢獻1886條經驗 獲得超2個贊
在Scala中有三種定義方法:
def
定義一個方法val
定義一個固定值(不能修改)var
定義一個變量(可以修改)
看看你的代碼:
def person = new Person("Kumar",12)
這定義了一個名為的新方法person
。您可以只調用此方法,()
因為它被定義為無參數方法。對于empty-paren方法,你可以使用或不使用'()'來調用它。如果你只是寫:
person
那么你正在調用這個方法(如果你沒有分配返回值,它將被丟棄)。在這行代碼中:
person.age = 20
會發生什么是你首先調用person
方法,并在返回值(類的實例Person
)上更改age
成員變量。
最后一行:
println(person.age)
在這里,您再次調用該person
方法,該方法返回一個新的類實例Person
(age
設置為12)。它與此相同:
println(person().age)

TA貢獻1719條經驗 獲得超6個贊
我首先介紹了def,val和var之間Scala中存在的區別。
def - 為懶惰評估的右側內容定義不可變標簽 - 按名稱評估。
val - 為急劇/立即評估的右側內容定義不可變標簽 - 按值評估。
var - 定義一個可變變量,最初設置為評估的右側內容。
例如,def
scala> def something = 2 + 3 * 4 something: Intscala> something // now it's evaluated, lazily upon usageres30: Int = 14
例如,val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definitionsomethingelse: Int = 17
例子,var
scala> var aVariable = 2 * 3aVariable: Int = 6scala> aVariable = 5aVariable: Int = 5
根據上面的說法,def和val的標簽不能重新分配,如果有任何嘗試,將引發如下所示的錯誤:
scala> something = 5 * 6<console>:8: error: value something_= is not a member of object $iw something = 5 * 6 ^
當類被定義為:
scala> class Person(val name: String, var age: Int)defined class Person
然后實例化:
scala> def personA = new Person("Tim", 25)personA: Person
一個不可變的標簽被用于人(即“人物角色)的該特定實例創建的。每當需要修改可變字段'age'時,此類嘗試將失敗:
scala> personA.age = 44personA.age: Int = 25
正如預期的那樣,'年齡'是不可變標簽的一部分。處理此問題的正確方法包括使用可變變量,如下例所示:
scala> var personB = new Person("Matt", 36)personB: Person = Person@59cd11fe scala> personB.age = 44personB.age: Int = 44 // value re-assigned, as expected
很明顯,從可變變量引用(即'personB')可以修改類可變字段'age'。
我仍然會強調,所有內容都來自上述差異,任何Scala程序員都必須清楚這一點。

TA貢獻1796條經驗 獲得超4個贊
同
def person = new Person("Kumar", 12)
你正在定義一個函數/惰性變量,它總是返回一個名為“Kumar”且年齡為12的新Person實例。這是完全有效的,編譯器沒有理由抱怨。調用person.age將返回此新創建的Person實例的年齡,該實例始終為12。
寫作時
person.age = 45
您為類Person中的age屬性分配一個新值,該值有效,因為age聲明為var
。如果您嘗試person
使用新的Person對象重新分配,編譯器會抱怨
person = new Person("Steve", 13) // Error
- 3 回答
- 0 關注
- 939 瀏覽
添加回答
舉報