..


Sponzorované odkazy

Funkcionálne programovanie v Ruby

Článok napísal Alessio Saltarini
Strana 1 z 2

Úvod

Funkcionálne programovanie (FP) je programovací vzor alternatívu k tradičným (alebo štrukturálne nutné programovanie a objektovo orientované programovanie) vymyslel, ako "lambda kalkulu" od Alonso cirkev za posledných 30 rokov, dlho predtým, než bolo známe, že presne to, čo počítač.

Štúdia kostol slúžil ako základ pre vývoj programovací jazyk Lisp, a potom boli takmer úplne opustené, ako to potvrdil imperatívnych počítač, ktorý vygeneroval Basic a Pascal, C, a dnes moderné C + + a Java.

Základnou myšlienkou lambda je, že počítačový program môže byť vyjadrená namiesto povinného sadu inštrukcií (to, potom sa to, potom to, že), s radom funkcií, ktorej parametre sú čo najviac funkcie.

Funkčné program, je obvykle zložený z funkcie, ktorá berie ako vstup Ďalšie funkcie, ktorá vezme ďalšie funkcie ako vstup, a tak ďalej.

To znamená, že zatiaľ čo tradičné program, napísaný v imperatív paradigmy, alebo predmety, sa skladá zo série príkazov, ktoré pôsobia na premenné, ktorej hodnota predstavuje "štát" v programe, funkcionálne programovanie poňatie premenná neexistuje (nie je pojem "štát"), a výkon je zverený k množstvu funkcií, ktoré fungujú na konštantné funkcie.

Záujem o funkcionálnych jazykov sa stratila počas času z niekoľkých dôvodov, predovšetkým obtiažnosť učenia (obvykle človek si myslí, že objekty, skôr než funkcií, ak je to matematik!) A ťažkosti pri hľadaní efektívny kompilátory a tlmočníkov.

Ruby a FP

Dnes bol tento záujem vzbudil, však, pretože funkcionálne programovanie so sebou prináša dôsledok veľmi cenné: nemôže samozrejme za následok run-time chýb. Inými slovami, v dobe kompilácie alebo prvýkrát buď to funguje alebo nefunguje. Nedá sa správajú spôsobom, nemožno predvídať vopred (vo funkčnej program, v skutočnosti neexistuje žiadny koncept výnimky).

Tak sa narodili a niektorí sa darí funkčné jazyky (viac či menej čisté, a viac či menej podporu tradičnej programovanie) ako: ML / OCaml , Haskell , F # .

Ruby nie je funkčný jazyk, ale používa niektoré funkčné programovacie techniky, ktoré nám môžu pomôcť, aby sa viac algoritmov umelé, silnejšie a účinnejšie. Okrem toho, že všeobecne čitateľnejší.

Každý a máp

Prvé charakteristikou jazykov, ktoré podporujú nejakým spôsobom FP je mať vo svojej štandardnej knižnici funkčných iterátory. Napríklad:






 $ Prvky = [1,2,3,4,5]







 $ {Elementi.map | elom | dá elom + 1}



Funkcia "map" a "každý" v Ruby nie je nič iné ako použiť FP! V skutočnosti existuje funkcie, ktoré majú iné funkcie ako argumenty. V Ruby, teda, že tie časti bloky kódu, uzavretý v {} alebo medzi to / koniec anonymný funkcie sú vyrobené špeciálne byť predmety z mnohých funkcií.

Tieto funkcie sa nazývajú funkcií FP vyššieho poriadku, teda funkcie, ktoré sa čo najviac funkcií, ako vstup.

V osobitných zákonov, "máp", ako klasický a matematické funkcie môže byť takto: pre každý prvok série jedna až päť, spustite funkciu: vytlačí ďalšie prirodzené číslo.

, Že "máp" a "kolegovia", pre každý prvok kolekcie (pole v Ruby by povedal) určité funkcie definované v bloku.

To isté by sa stalo, prirodzene s:

 



 $ Elementi.each {...}

 
Uzávery: preco a lambda

Uzávery sú koncepcie podobné ako u vyššieho rádu funkcie: možnosť definovať podstatné funkcie, aby zákon o premenné, ktoré žijú v situácii odlišnej od funkcie (ako je globálne premenné alebo funkcie iných premenných).

V Ruby, môžem písať uzavretie pomocou anonymné funkcie, ktoré môžu byť definované pomocou kľúčových slov Proc.new alebo lambda.

Tu je príklad:






 posledné násobenie (násobič)



    



 návrat lambda {| n | n * násobič}







 koniec









 per3 = násobenie (3)









 per3.call dá (3) # => 9







 kladie per3.call (per8.call (2)) # => 48



V tomto prípade, a to nielen funkciu hovorím samozrejmé "násobenie". Čo je tak osobitného na túto funkciu? Tu jednoducho nepoužívajú žiadne premenné!

Tento argument nie je premenná násobič je proste zástupný symbol pre konštantu alebo funkciu.

Ale v tradičnej programovanie, tak by som napísať:






 def násobenia (a, b)



    



 vrátiť a * b







 koniec









 kladie násobenie (3.3)



Ako je vidieť, ale pomocou uzavretie hovorím "prevádzkovateľ" I call per3, ktoré vymedzujú správanie všetkých násobenia "x3". Potom som volať tento operátor číslo 3. Ja si dokonca nazvať rekurzívne! Alebo hovoria, miesto konštanty, na inú funkciu.

V tradičnej programovanie, ale som nútený určiť a priori počet premenných, ktorých sa transakcia - čo obmedzuje rozmnožovanie dvoch čísel - a čo je najdôležitejšie, musím vložiť poňatie štátu, prideľovanie pamäte pre dve premenné, ktoré obsahujú hodnoty, ktoré sa násobia.

V rovnakej kategórii ...
E-Learning
Ruby a Ruby on Rails (kurz) Ruby a Ruby on Rails (kurz)
Tvorba softvéru a webových aplikácií s Ruby a ROR. Od 39 €.
Sponzorované odkazy