ผมขอเริ่มต้นด้วยความแตกต่างที่มีอยู่ในสกาลาระหว่างdef , Valและvar
def - กำหนดป้ายกำกับที่ไม่เปลี่ยนรูปสำหรับเนื้อหาด้านขวาซึ่งประเมินอย่างเกียจคร้าน - ประเมินโดยใช้ชื่อ
val - กำหนดป้ายกำกับที่ไม่เปลี่ยนรูปสำหรับเนื้อหาด้านขวาซึ่งถูกประเมินอย่างกระตือรือร้น / ทันที - ประเมินโดยมูลค่า
var - กำหนดตัวแปรที่ไม่แน่นอนซึ่งเริ่มแรกถูกตั้งค่าเป็นเนื้อหาด้านขวาที่ประเมิน
ตัวอย่าง def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
ตัวอย่างวาล
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
ตัวอย่างเช่น
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: 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
ฉลากไม่เปลี่ยนรูปถูกสร้างขึ้นสำหรับกรณีเฉพาะของท่าน (เช่น 'Persona) เมื่อใดก็ตามที่ฟิลด์ 'อายุ' ไม่สามารถเปลี่ยนแปลงได้จำเป็นต้องแก้ไขความพยายามดังกล่าวจะล้มเหลว:
scala> personA.age = 44
personA.age: Int = 25
ตามที่คาดไว้ 'อายุ' เป็นส่วนหนึ่งของป้ายกำกับที่ไม่สามารถเปลี่ยนแปลงได้ วิธีที่ถูกต้องในการทำงานกับสิ่งนี้ประกอบด้วยการใช้ตัวแปรที่ไม่แน่นอนเช่นในตัวอย่างต่อไปนี้:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
ชัดเจนจากการอ้างอิงตัวแปรที่ไม่แน่นอน (เช่น 'personB') เป็นไปได้ที่จะแก้ไขฟิลด์ 'อายุ' คลาสที่ไม่แน่นอน
ฉันจะยังคงเน้นความจริงที่ว่าทุกอย่างมาจากความแตกต่างที่ระบุไว้ข้างต้นซึ่งจะต้องมีความชัดเจนในใจของโปรแกรมเมอร์สกาล่าใด ๆ
val
สามารถเปลี่ยนแปลงได้ แต่วัตถุที่ถูกอ้างถึงโดย val ไม่สามารถทำได้ Aval
ไม่ใช่ค่าคงที่