Diyelim ki bazı üye işlevleriyle 3 çiftli tutmak için bir yapımız var:
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;
}
// ...
};
Bu biraz basitlik için yapılıyor, ancak eminim benzer kodların orada olduğunu kabul ediyorsunuz. Yöntemler, uygun şekilde zincirleme yapmanıza izin verir, örneğin:
Vector v = ...;
v.normalize().negate();
Ya da:
Vector v = Vector{1., 2., 3.}.normalize().negate();
Şimdi begin () ve end () fonksiyonlarını sağlasaydık, Vector'ümüzü yeni bir döngü için kullanabiliriz, örneğin x, y ve z 3 koordinatı üzerinden döngü yapmak için (hiç şüphesiz daha "faydalı" örnekler inşa edemezsiniz) Vector öğesini örneğin String ile değiştirerek):
Vector v = ...;
for (double x : v) { ... }
Hatta yapabiliriz:
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
ve ayrıca:
for (double x : Vector{1., 2., 3.}) { ... }
Ancak, şu (bana öyle geliyor) bozuk:
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
Önceki iki kullanımın mantıksal bir kombinasyonu gibi görünse de, bu son kullanımın sarkan bir referans oluşturduğunu ve önceki ikisi tamamen iyi olduğunu düşünüyorum.
- Bu doğru mu ve geniş ölçüde takdir ediliyor mu?
- Yukarıdakilerin hangi kısmı "kötü" kısımdır, bundan kaçınılması gerekir?
- Dil, aralık tabanlı for döngüsünün tanımını değiştirerek, for-expression içinde oluşturulan geçicilerin döngü süresince var olmasını sağlayarak iyileştirilebilir mi?