Garis bawahi penggunaan dalam pengidentifikasi Scala

Saya memiliki kelas dengan pengambil/penyetel:

class Person {
    private var _age = 0

    //getter
    def age = _age

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

Kita tahu bahwa kita dapat memanggil metode penyetel seperti ini:

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

Yang menarik dalam kasus ini adalah: garis bawah (_) di def age_= dapat dihilangkan ketika metode ini dipanggil.

Pertanyaan saya adalah untuk apa garis bawah digunakan dalam kasus ini?

Seseorang mengatakan kepada saya bahwa ini digunakan untuk memisahkan karakter non-alfanum dalam pengidentifikasi. Jadi saya mencoba ini:

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

Mengapa saya tidak bisa menghapus garis bawah dalam kasus ini?

Juga, jika saya mencoba menggunakan garis bawah lebih dari sekali:

val x_=_x = 1

Saya juga mendapat kesalahan kompilasi.

Apakah ada aturan penggunaan garis bawah dan apa istilah penggunaan garis bawah ini?


person null    schedule 02.01.2015    source sumber
comment
Lihatlah stackoverflow.com/questions/8000903/ untuk penggunaan garis bawah lainnya di Scala. Jawaban ini juga menjelaskan cara kerja penggantian operator penugasan.   -  person rsenna    schedule 02.01.2015


Jawaban (1)


Kesalahan kompilasi menjelaskan semuanya, sungguh:

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

Hanya metode yang diperbolehkan memiliki nama yang diakhiri dengan _=. Hal ini masuk akal, karena akan sangat membingungkan jika mengizinkan suatu val diberi nama x_=

Namun memang benar bahwa garis bawah digunakan untuk memisahkan karakter alfanumerik dari karakter khusus. Hanya saja dalam kasus val atau var, Anda tidak dapat mengakhirinya dengan =

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

Menurut saya, garis bawah lain tidak diperbolehkan setelah garis bawah pertama yang mendahului karakter khusus.

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

Berdasarkan spesifikasi bahasa Scala :

Pertama, sebuah pengenal dapat dimulai dengan sebuah huruf yang dapat diikuti dengan rangkaian huruf dan angka yang berubah-ubah. Ini dapat diikuti dengan karakter garis bawah '' dan string lain yang terdiri dari huruf dan angka atau karakter operator.

Lihat juga Contoh 1.1.1 dalam spesifikasi tertaut untuk contoh pengidentifikasi yang valid.

person Michael Zajac    schedule 02.01.2015
comment
Terima kasih banyak. Tapi apa penjelasan p.age= 8-4? Tidak perlu memberi garis bawah. - person null; 02.01.2015
comment
Sebenarnya bukan Anda menghilangkan garis bawah. Kompiler hanya menangani metode yang diakhiri dengan _= secara khusus. yaitu p.age = 8-4 ditangani seperti p.age_=(8-4). Perhatikan bagaimana Anda juga bisa memberi spasi di sana. - person Michael Zajac; 02.01.2015
comment
Jadi kita dapat mengatakan bahwa penghapusan garis bawah dalam kasus ini adalah bagian dari sintaksis bahasa? - person null; 02.01.2015
comment
Jadi begitu. Saya harap tidak banyak pola ajaib yang digunakan dalam scala. - person null; 02.01.2015