Bagaimana cara kompilasi berikut:
import scala.concurrent.duration._
val time = 20 seconds
Apa yang sebenarnya terjadi di sini?
Ada beberapa hal yang terjadi.
Pertama, Scala memungkinkan titik dan paren dihilangkan dari banyak pemanggilan metode, jadi 20 seconds
sama dengan 20.seconds()
*.
Kedua, "konversi implisit" diterapkan. Karena 20
merupakan Int
dan Int
tidak memiliki seconds
metode, pencarian compiler untuk konversi implisit yang mengambil Int
dan mengembalikan sesuatu yang memang memiliki sebuah seconds
metode, dengan pencarian dibatasi oleh ruang lingkup panggilan metode Anda.
Anda telah mengimpor DurationInt ke dalam cakupan Anda. Karena DurationInt
kelas implisit dengan Int
parameter, konstruktornya mendefinisikan Int => DurationInt
konversi implisit . DurationInt
memiliki seconds
metode, sehingga memenuhi semua kriteria pencarian. Oleh karena itu, kompiler menulis ulang panggilan Anda sebagai new DurationInt(20).seconds
**.
* Maksud saya ini secara longgar. 20.seconds()
sebenarnya tidak valid karena seconds
metode tidak memiliki daftar parameter dan oleh karena itu parens harus dihilangkan pada panggilan metode.
** Sebenarnya, ini tidak sepenuhnya benar karena DurationInt
merupakan kelas nilai, jadi kompiler akan menghindari membungkus integer jika memungkinkan.
new DurationInt(20).seconds()
selama Anda tahu bagaimana melakukannya)seconds
metode ini didefinisikan tanpa parens, jadi memanggilnya dengan parens adalah kesalahan.20.seconds()
dalam Scala, hanya saja kompiler menerjemahkan panggilan dengan cara itu. Layak untuk menunjukkan bahwa Scala mengharuskan Anda untuk menghilangkan parens jika metode yang sesuai tidak memiliki daftar parameter, seperti dalam kasus ini."Sihir" yang terjadi di sana disebut "konversi implisit". Anda mengimpor konversi implisit, dan beberapa di antaranya menangani konversi antara Int (dan Double) ke Durasi. Itulah yang sedang Anda hadapi.
sumber
import scala.concurrent.duration._
diselesaikan20 seconds
tetapi sebenarnya mengimporDurationConversions
Trait tidak? EDIT : Baru menyadari apa yang sebenarnya mereka imporDurationInt
. Saya menduga ini karena Anda tidak dapat mengimpor Trait yang sebenarnya? Hanya implementasi sifat yang konkret?