Di Scala, kita dapat menggunakan setidaknya dua metode untuk retrofit tipe yang sudah ada atau yang baru. Misalkan kita ingin menyatakan bahwa sesuatu dapat dikuantifikasi menggunakan Int
. Kita dapat mendefinisikan sifat berikut.
Konversi implisit
trait Quantifiable{ def quantify: Int }
Dan kemudian kita dapat menggunakan konversi implisit untuk mengukur misalnya String dan Daftar.
implicit def string2quant(s: String) = new Quantifiable{
def quantify = s.size
}
implicit def list2quantifiable[A](l: List[A]) = new Quantifiable{
val quantify = l.size
}
Setelah mengimpor ini, kita dapat memanggil metode quantify
pada string dan daftar. Perhatikan bahwa daftar yang dapat diukur menyimpan panjangnya, sehingga menghindari traversal daftar yang mahal pada panggilan berikutnya ke quantify
.
Ketik kelas
Alternatifnya adalah dengan mendefinisikan "saksi" Quantified[A]
yang menyatakan, bahwa beberapa tipe A
dapat dikuantifikasi.
trait Quantified[A] { def quantify(a: A): Int }
Kami kemudian menyediakan contoh kelas jenis ini untuk String
dan di List
suatu tempat.
implicit val stringQuantifiable = new Quantified[String] {
def quantify(s: String) = s.size
}
Dan jika kita kemudian menulis metode yang perlu mengukur argumennya, kita menulis:
def sumQuantities[A](as: List[A])(implicit ev: Quantified[A]) =
as.map(ev.quantify).sum
Atau menggunakan sintaks terikat konteks:
def sumQuantities[A: Quantified](as: List[A]) =
as.map(implicitly[Quantified[A]].quantify).sum
Tetapi kapan harus menggunakan metode yang mana?
Sekarang pertanyaannya. Bagaimana saya bisa memutuskan di antara kedua konsep itu?
Apa yang saya perhatikan sejauh ini.
jenis kelas
- kelas tipe memungkinkan sintaks terikat konteks yang bagus
- dengan kelas tipe saya tidak membuat objek pembungkus baru pada setiap penggunaan
- sintaks konteks terikat tidak berfungsi lagi jika kelas tipe memiliki beberapa parameter tipe; bayangkan saya ingin mengukur hal-hal tidak hanya dengan bilangan bulat tetapi dengan nilai-nilai dari beberapa tipe umum
T
. Saya ingin membuat kelas tipeQuantified[A,T]
konversi implisit
- sejak saya membuat objek baru, saya dapat menyimpan nilai di sana atau menghitung representasi yang lebih baik; tetapi haruskah saya menghindari ini, karena ini mungkin terjadi beberapa kali dan konversi eksplisit mungkin hanya akan dipanggil sekali?
Apa yang saya harapkan dari sebuah jawaban
Sajikan satu (atau lebih) kasus penggunaan di mana perbedaan antara kedua konsep itu penting dan jelaskan mengapa saya lebih memilih salah satu daripada yang lain. Juga menjelaskan esensi dari kedua konsep dan hubungannya satu sama lain akan menyenangkan, bahkan tanpa contoh.