2013-02-08 11 views
5

Kiedy wykonuję przecięcie dwóch tablic, czy istnieje gwarancja, że ​​wynikowa kolejność jest oparta na kolejności pierwszej macierzy?Czy kolejność jest zachowywana w tablicach po zakończeniu przecięcia?

Na przykład, jeśli mam

a = [1,2,3] 
b = [3,2,1] 

mógł a & b zwrot [3,2,1], zamiast [1,2,3] (czego bym się spodziewać)?

Nie mogę znaleźć niczego bezpośrednio odnoszącego się do tego w dokumentacji Arkusza RDoc lub Pickaxe.

RubySpec ma specyfikację, że jest to creates an array with elements in order they are first encountered, ale czy powinienem przyjąć, że YARV Ruby spełni tę specyfikację?

+1

Przez szybkie spojrzenie na kod C (http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-26), powiedziałbym, że wydaje się zachować porządek – pjam

Odpowiedz

3

Wygląda na to, że jest to funkcja gwarantowana. Zaktualizowali opis RDoc w revision 39415. Powinno to być kiedyś odzwierciedlone.

0

YARV jest oficjalnym tłumaczem Ruby od wersji 1.9, więc zakładam, że to honoruje tę specyfikację. I BTW, RubySpec została stworzona jako wykonywalna specyfikacja języka, pozwalając programistom na tworzenie własnych interpretatorów, którzy przekazują tę specyfikację i uważam, że YARV został stworzony z myślą o RubySpec.

+1

RubySpec nie ma oficjalnej przynależności do rozwoju Ruby, więc nie gwarantuje, że MRI/YARV Ruby zawsze będzie działało w ten sposób, ale bardziej po prostu teraz. –

+0

@AndrewMarshall Oczywiście, nie sugeruję czegoś takiego. Chciałem tylko wskazać to i że, jak powiedziałem, wierzę, że YARV używał tej specyfikacji, na przykład IronRuby. –

+0

RubySpec nie ma oficjalnej przynależności, ale był częścią zestawu do testów MRI w 2010 roku, a kiedy nad tym pracowałem (jako część zespołu IronRuby), oni również aktywnie w tym uczestniczyli. –

0

Nie ma gwarancji w dokumentacji, ale przecięcie następuje po rozkazie lewej ręki.

Źródłem pokazuje, że tablicę a ustawia kolejność:

... 
for (i=0; i<RARRAY_LEN(ary1); i++) { 
    vv = (st_data_t)(v = rb_ary_elt(ary1, i)); 
    if (st_delete(RHASH_TBL(hash), &vv, 0)) { 
     rb_ary_push(ary3, v); 
    } 
} 
... 

to proste do badania:

a = [1,2,3] 
b = [3,2,1] 

a.size.times do 
    puts "a = #{ a.join(',') }\ta & b = #{ (a & b).join(',') }\tb & a = #{ (b & a).join(',') }" 
    a.rotate! 
end 

które wyjścia:

 
a = 1,2,3 a & b = 1,2,3 b & a = 3,2,1 
a = 2,3,1 a & b = 2,3,1 b & a = 3,2,1 
a = 3,1,2 a & b = 3,1,2 b & a = 3,2,1 

To Korzystanie Ruby 1.9.3- p374

+1

Myślę, że nie o to chodzi. Myślę, że OP wie, że kolejność jest zachowana (przynajmniej pod obecną implementacją MRI). Pyta się, czy ma to być funkcja, czy nie. Innymi słowy, jeśli zostanie znaleziony nowy algorytm C do implementacji metody, który nie zachowuje zamówienia, czy przyszła implementacja nie zachowa zamówienia lub zachowa zamówienie. – sawa

+1

@sawa dziękuję za opublikowanie raportu o błędzie! –

+1

@AndrewGrimm Nie ma za co. Nie byłem pewien, czy zauważysz. Mam nadzieję, że ci się to spodoba. http://bugs.ruby-lang.org/issues/7803 – sawa

Powiązane problemy