ขีดเส้นใต้การใช้งานในตัวระบุของ Scala

ฉันมีคลาสที่มี getter/setter:

class Person {
    private var _age = 0

    //getter
    def age = _age

    //setter
    def age_=(value: Int): Unit = _age = value
}

เรารู้ว่าเราสามารถเรียกใช้เมธอด setter ได้ดังนี้:

val p = new Person()
p.age= (2)
p age= 11
p.age= 8-4

สิ่งที่น่าสนใจในกรณีนี้คือ: ขีดล่าง (_) ใน def age_= สามารถลบออกได้เมื่อมีการเรียกใช้เมธอด

คำถามของฉันคือขีดเส้นใต้ที่ใช้ในกรณีนี้คืออะไร?

มีคนบอกฉันว่ามันใช้เพื่อแยกอักขระที่ไม่ใช่ตัวอักษรในตัวระบุ ดังนั้นฉันจึงลองสิ่งนี้:

var x_= = 20
x_= = 10
x= = 5    // I got error here

เหตุใดฉันจึงไม่สามารถลบขีดล่างในกรณีนี้ได้

นอกจากนี้ หากฉันพยายามใช้ขีดล่างมากกว่าหนึ่งครั้ง:

val x_=_x = 1

ฉันได้รับข้อผิดพลาดในการคอมไพล์ด้วย

มีกฎเกณฑ์เกี่ยวกับการใช้ขีดล่างหรือไม่ และการใช้ขีดล่างนี้เรียกว่าอะไร?


person null    schedule 02.01.2015    source แหล่งที่มา
comment
ดูที่ stackoverflow.com/questions/8000903/ สำหรับการใช้งานอื่น ๆ ของขีดล่างใน Scala คำตอบนี้ยังอธิบายวิธีการทำงานของตัวดำเนินการที่ได้รับมอบหมายด้วย   -  person rsenna    schedule 02.01.2015


คำตอบ (1)


ข้อผิดพลาดในการคอมไพล์บอกทุกอย่างจริงๆ:

scala> var x_= = 20
<console>:10: error: Names of vals or vars may not end in `_='

อนุญาตให้เฉพาะเมธอดเท่านั้นที่จะมีชื่อที่ลงท้ายด้วย _= สิ่งนี้สมเหตุสมผล เพราะมันจริงๆจะทำให้เกิดความสับสนในการตั้งชื่อ val x_=

อย่างไรก็ตาม เป็นความจริงที่เครื่องหมายขีดล่างใช้เพื่อแยกอักขระตัวอักษรและตัวเลขออกจากอักขระพิเศษ เพียงแต่ในกรณีของ val หรือ var คุณจะไม่สามารถลงท้ายด้วย = ได้

scala> var x_# = 20
x_#: Int = 20
scala> x_# = 10
x_$hash: Int = 10

ฉันไม่คิดว่าอนุญาตให้ใช้ขีดล่างอื่นต่อจากขีดล่างแรกที่นำหน้าอักขระพิเศษ

val x_y_^ = 1    // Ok
val x_^_^ = 1    // Not ok

อิงตามข้อกำหนดภาษา Scala :

ขั้นแรก ตัวระบุสามารถเริ่มต้นด้วยตัวอักษรซึ่งสามารถตามด้วยตัวอักษรและตัวเลขตามลำดับที่ต้องการได้ ซึ่งอาจตามด้วยอักขระขีดล่าง '' และสตริงอื่นที่ประกอบด้วยตัวอักษรและตัวเลขหรืออักขระตัวดำเนินการ

ดูเพิ่มเติมตัวอย่าง 1.1.1 ในข้อกำหนดเฉพาะที่เชื่อมโยงสำหรับตัวอย่างของตัวระบุที่ถูกต้อง

person Michael Zajac    schedule 02.01.2015
comment
ขอบคุณมาก ๆ. แต่คำอธิบายของ p.age= 8-4 คืออะไร? ไม่จำเป็นต้องใส่ขีดล่าง - person null; 02.01.2015
comment
ไม่ใช่ว่าคุณกำลังขีดเส้นใต้ใช่ไหม คอมไพเลอร์จะจัดการกับวิธีการที่ลงท้ายด้วย _= โดยเฉพาะ นั่นคือ p.age = 8-4 ได้รับการจัดการเหมือน p.age_=(8-4) สังเกตว่าคุณสามารถใส่ช่องว่างตรงนั้นได้อย่างไร - person Michael Zajac; 02.01.2015
comment
ดังนั้นเราจึงบอกได้ว่าการลบขีดล่างในกรณีนี้เป็นส่วนหนึ่งของไวยากรณ์ของภาษาใช่ไหม - person null; 02.01.2015
comment
ฉันเห็น. ฉันหวังว่าจะมีการใช้รูปแบบเวทย์มนตร์ไม่มากนักในสกาล่า - person null; 02.01.2015