|x, y| to są dwa argumenty bloku (czyli czegoś wykonywanego dla każdej pary w tym przypadku).
<=> to “Combined comparison operator. Returns 0 if first operand equals second, 1
if first operand is greater than the second and -1 if first operand is
less than the second.”
Natomiast wyjaśnienie z Ruby doc: “The block must implement a comparison between a and
b, and return -1, when a follows
b, 0 when a and b are
equivalent, or +1 if b follows a.”
Gdybym miał to wyjaśnić łopatologicznie, to dla “a > b” wynikiem jest +1, co dla sort oznacza przesunięcie a o jedną pozycję do tyłu, a dla a < b" -1 i o jedną do przodu. Nie wiem, czy faktycznie tak się dzieje (na pewno nie dokładnie tak, bo w takim przypadku pętla by działała w nieskończoność dla a != b), ale wyjaśnienie nie najgorsze.
Nie wiem, jaki algorytm jest stosowany, ale wyjaśnienie, które podałem powyżej przypomina algorytm bąbelkowy. Możesz sprawdzić na Wiki co to jest sortowanie bąbelkowe. Z tego co pamiętam, jest tam nawet implementacja w Ruby.
Jeśli natomiast nie wiesz, jak działa blok, to cóż… to jest podstawa języka Ruby, więc wszędzie znajdziesz wyjaśnienia. W uproszczeniu: między pipe’ami ( |…| ) dajesz sortowi informację, że chcesz, aby on tam ci wstawił dwie liczby x i y. Tak się składa, że sort akurat przekazuje do bloku dwie liczby, więc nie ma tutaj problemu. Sort następnie wykonuje wewnętrzny kod (między do i end) kilka razy. Ile, to już zależy od samego sorta. Tyle ile trzeba.Za każdym razem przekazuje dwie nowe zmienne i wykonuje kod, a jego wynik "wciąga:’ z powrotem do swojego kodu. Można powiedzieć, że blok to sposób wrzucenia swojego kodu w środek jakiegoś innego algorytmu/w środek innej metody. W tym przypadku jest to algorytm sortowania.