Jednolinijkowe rekurencyjne wywołanie w Rubym

Siedząc dzisiaj na wykopie, natrafiłem na wątek, gdzie pewien Pan chciał wyrazić swoje niezadowolenie z racji tego, że ten link już był. Zrobił to tak:

#include <iostream>
using namespace std;
int main() {
int l;
for (l=1;l<1000;++l) {
cout <<"Było!! "<<endl;
}
return 0;
} 

Pomysł fajny, nie powiem. Ale można prościej!

1000.times { p "Było!" }

Można też tak (wersja w PHP - autor LostHighway):

function Go($i) { if($i) return Go($i-1).' Było!!'; }
echo Go(1000); 

Uważniejsi zauważą że powyższy kod, jest kodem bezpętlowym. 1000krotne wywołanie następuje dzięki rekurencji.

Nie byłbym sobą, gdybym nie postanowił napisać tego w jednej linijce w Rubym :)

lambda {|a, x| "Bylo! #{a.call(a, x-1)}" if x > 0}.tap{ |r| p r.call(r, 1000)}

Działanie tego kodu jest bardzo proste.

Najpierw tworzymy funkcję anonimową (to co w klamerkach po lambda). Funkcja ta jest funkcją rekurencyjną, która przyjmuje dwa parametry: kod do wykonania (w postaci obiektu typu Proc) oraz licznik.

Następnie korzystam z metody tap która wywołuje taką funkcję anonimową, dzięki czemu mogę ją odpalić :)

Przykład ten doskonale ilustruje zarówno to jak Ruby jest zwięzły, jak i możliwości korzystania z funkcji anonimowych.

Categories: Other, PHP, Ruby

1 Comment

  1. Trzeba przyznać, Matz zrobił dla świata coś fantastycznego. Szczególnie dla naszego – programistycznego. Ruby – to najlepsza rzecz jaka mnie spotkała, a powyższy przykład pokazuje drzemiące w nim możliwości :) Dla wielu (nowych) programistów, obiekty Proc w Rubym mogą wydać się co najmniej dziwne i co smutne – zbędne. Powyższy przykład powinien trafić do oficjalnej dokumentacji Ruby’ego :D

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Copyright © 2024 Closer to Code

Theme by Anders NorenUp ↑