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.
March 12, 2013 — 19:06
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