2012-10-22 17 views
5

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.

Odpowiedz

5

wziąć szablon korzysta hasSlicing celu ustalenia, czy kawałek wejścia mogą być zwrócone zamiast Take! R struct. Sprawdzenie rzeczywistych typów zwracanych czyni go nieco bardziej jasne:

import std.range, std.stdio; 

void main() 
{ 
    auto chararr = ['a', 'b', 'c', 'd']; 
    auto a = chararr.take(3); 
    writeln(typeid(typeof(a))); 

    auto intarr = [ 1, 2, 3, 4 ]; 
    auto b = intarr.take(3); 
    writeln(typeid(typeof(b))); 
} 

// Output: 
// std.range.Take!(char[]).Take 
// int[] 

hasSlicing wyraźnie pouczeni, aby powrócić fałszywe dla wszystkich „wąskich ciągi” - tych, których elementem nie może reprezentować jeden znak, ale punkt kodu (char i oparte na wchar).

Oto, gdzie zaczynają się moje spekulacje, ale przypuszczam, że robi się to, aby zapobiec przypadkowemu utworzeniu zniekształconych ciągów Co UTF-8 & za pomocą cięcia. Lepiej używać dchar [], jeśli nie masz prawdziwej potrzeby w char [].

+0

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

+1

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. –

+1

P.S. Polecam używanie tagu d lub zarówno d, jak i d2, ponieważ o wiele więcej osób subskrybuje d feed. –

Powiązane problemy