Salah satu fitur baru Scala 2.8 adalah batas konteks. Apa itu konteks terikat dan di mana itu berguna?
Tentu saja saya mencari terlebih dahulu (dan menemukan ini misalnya ) tetapi saya tidak dapat menemukan informasi yang benar-benar jelas dan rinci.
scala
scala-2.8
context-bound
Jesper
sumber
sumber
Jawaban:
Apakah Anda menemukan artikel ini ? Ini mencakup fitur terikat konteks baru, dalam konteks peningkatan array.
Umumnya, parameter tipe dengan konteks terikat adalah dalam bentuk
[T: Bound]
; itu diperluas ke parameter tipe biasaT
bersama dengan parameter tipe implisitBound[T]
.Pertimbangkan metode
tabulate
yang membentuk larik dari hasil penerapan fungsi tertentu f pada rentang angka dari 0 hingga panjang tertentu. Sampai dengan Scala 2.7, tabulasi dapat ditulis sebagai berikut:Dalam Scala 2.8 hal ini tidak lagi memungkinkan, karena informasi runtime diperlukan untuk membuat representasi yang tepat
Array[T]
. Seseorang perlu memberikan informasi ini dengan meneruskan aClassManifest[T]
ke dalam metode sebagai parameter implisit:Sebagai bentuk singkatan, konteks terikat dapat digunakan pada parameter tipe
T
sebagai gantinya, memberikan:sumber
Jawaban Robert mencakup detail teknis dari Batas Konteks. Saya akan memberikan interpretasi saya tentang artinya.
Dalam Scala, sebuah View Bound (
A <% B
) menangkap konsep 'dapat dilihat sebagai' (sedangkan batas atas<:
menangkap konsep 'adalah a'). Konteks terikat (A : C
) mengatakan 'memiliki' tentang suatu tipe. Anda dapat membaca contoh tentang manifes sebagai "T
memilikiManifest
". Contoh yang Anda tautkan ke tentangOrdered
vsOrdering
menggambarkan perbedaannya. Sebuah metodemengatakan bahwa parameter dapat dilihat sebagai file
Ordered
. Dibandingkan denganyang mengatakan bahwa parameter memiliki keterkaitan
Ordering
.Dalam hal penggunaan, perlu waktu beberapa saat agar konvensi dapat ditetapkan, tetapi batas konteks lebih disukai daripada batas tampilan ( batas tampilan sekarang tidak digunakan lagi ). Salah satu saran adalah bahwa konteks terikat lebih disukai ketika Anda perlu mentransfer definisi implisit dari satu ruang lingkup ke lingkup lain tanpa perlu merujuknya secara langsung (ini tentu saja kasus yang
ClassManifest
digunakan untuk membuat larik).Cara lain untuk berpikir tentang batas tampilan dan batas konteks adalah bahwa yang pertama mentransfer konversi implisit dari cakupan pemanggil. Transfer kedua objek implisit dari lingkup pemanggil.
sumber
has a
Lebih masuk akal bagi saya](Ini adalah catatan dalam tanda kurung. Baca dan pahami jawaban lainnya terlebih dahulu.)
Context Bounds sebenarnya menggeneralisasi View Bounds.
Jadi, diberikan kode ini yang diekspresikan dengan View Bound:
Ini juga bisa diekspresikan dengan Context Bound, dengan bantuan alias tipe yang mewakili fungsi dari tipe
F
ke tipeT
.Konteks terikat harus digunakan dengan tipe konstruktor
* => *
. Namun konstruktor tipeFunction1
adalah dari jenis(*, *) => *
. Penggunaan alias tipe menerapkan sebagian parameter tipe kedua dengan tipeString
, menghasilkan konstruktor tipe dari jenis yang tepat untuk digunakan sebagai terikat konteks.Ada sebuah proposal yang memungkinkan Anda untuk secara langsung mengekspresikan tipe yang diterapkan sebagian di Scala, tanpa menggunakan alias tipe di dalam sebuah ciri. Anda kemudian bisa menulis:
sumber
From
dari tipe tersebutTo[String]
. Kami tidak menyediakan argumen tipe keFrom
, jadi kami merujuk ke konstruktor tipe, bukan tipe. Konstruktor tipe ini adalah jenis yang tepat untuk digunakan sebagai konteks terikat -* -> *
. Ini membatasi parameter tipeT
dengan meminta parameter tipe implisitTo[String]#From[T]
. Perluas alias tipe, dan voila, Anda tersisaFunction1[String, T]
.Ini adalah catatan dalam tanda kurung lainnya.
Seperti yang ditunjukkan Ben , konteks terikat mewakili batasan "has-a" antara parameter tipe dan kelas tipe. Dengan kata lain, ini mewakili batasan bahwa nilai implisit dari kelas tipe tertentu ada.
Saat menggunakan ikatan konteks, seseorang sering kali perlu memunculkan nilai implisit itu. Misalnya, dengan adanya batasan
T : Ordering
, seseorang akan sering membutuhkan contohOrdering[T]
yang memenuhi batasan tersebut. Seperti yang ditunjukkan di sini , Anda dapat mengakses nilai implisit dengan menggunakanimplicitly
metode atau metode yang sedikit lebih membantucontext
:atau
sumber