Mari kita bayangkan kita memiliki sebuah struct untuk menampung 3 ganda dengan beberapa fungsi anggota:
struct Vector {
double x, y, z;
// ...
Vector &negate() {
x = -x; y = -y; z = -z;
return *this;
}
Vector &normalize() {
double s = 1./sqrt(x*x+y*y+z*z);
x *= s; y *= s; z *= s;
return *this;
}
// ...
};
Ini sedikit dibuat-buat untuk kesederhanaan, tetapi saya yakin Anda setuju bahwa kode serupa ada di luar sana. Metode ini memungkinkan Anda untuk merangkai dengan mudah, misalnya:
Vector v = ...;
v.normalize().negate();
Atau bahkan:
Vector v = Vector{1., 2., 3.}.normalize().negate();
Sekarang jika kita menyediakan fungsi begin () dan end (), kita bisa menggunakan Vector kita dalam gaya baru for loop, katakanlah untuk melakukan loop pada 3 koordinat x, y, dan z (Anda pasti bisa membuat contoh yang lebih "berguna" dengan mengganti Vector dengan misalnya String):
Vector v = ...;
for (double x : v) { ... }
Kami bahkan dapat melakukan:
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
dan juga:
for (double x : Vector{1., 2., 3.}) { ... }
Namun, berikut ini (menurut saya) rusak:
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
Meskipun sepertinya kombinasi logis dari dua penggunaan sebelumnya, saya pikir penggunaan terakhir ini menciptakan referensi yang menggantung sementara dua penggunaan sebelumnya baik-baik saja.
- Apakah ini benar dan dihargai secara luas?
- Bagian mana di atas yang merupakan bagian "buruk", yang harus dihindari?
- Akankah bahasa ditingkatkan dengan mengubah definisi loop berbasis rentang sedemikian rupa sehingga sementara yang dibangun dalam ekspresi-for ada selama durasi loop?