Próbuję użyć operatora plastra, aby uzyskać wycinek zwracanej wartości funkcji take ze std.range. Mój kod:Can not Slice Take! R od std.range w D?
auto tempChunk = ['a', 'b', 'c', 'd'];
auto a = tempChunk.take(3);
writeln(a[0..2]);
Jak Take R w tym przypadku jest po prostu alias char [], będę oczekiwać tego skompilować. Jednak kompilator mówi mi, że Take!(char[]) cannot be sliced with []
. Podając inny przykład:
int[] arr1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
auto s = arr.take(5);
writeln(s[0..4]);
Spowoduje to skompilowanie i uruchomienie bez problemu, drukowanie [1, 2, 3, 4, 5]. Jestem całkowicie zdezorientowany w tej kwestii, dlaczego pierwszy przykład nie zadziała, podczas gdy drugi nie.
Dziękuję, że to oczyszcza. Jednak Take struct definiuje opIndex, ale kiedy próbuję 'writeln (a [0]) ;, to nie działa. Jaki jest tego powód? – Meta
Definiuje on opIndex tylko dla RandomAccessRange, którego wąskie ciągi nie są. To uzasadnienie nie mogę zrozumieć, szczerze mówiąc, ponieważ wąskie struny w rzeczywistości są użyteczne jako zakres punktów dostępu o dostępie losowym poprzez natywne cięcie. To dobre pytanie. –
P.S. Polecam używanie tagu d lub zarówno d, jak i d2, ponieważ o wiele więcej osób subskrybuje d feed. –