# Ez egy komment=begin
Ez egy többsoros komment
Senki sem használja
Neked sem kellene
=end# Először is: Minden objektum# A számok objektumok3.class#=> Fixnum3.to_s#=> "3"# Néhány alapvető számtani művelet1+1#=> 28-1#=> 710*2#=> 2035/5#=> 72**5#=> 32# A számtani művelet csak szintaktikus cukor# az objektumon történő függvény hívásra1.+(3)#=> 410.*5#=> 50# A speciális értékek objektumoknil# Nincs itt semmi látnivalótrue# igazfalse# hamisnil.class#=> NilClasstrue.class#=> TrueClassfalse.class#=> FalseClass# Egyenlőség1==1#=> true2==1#=> false# Egyenlőtlenség1!=1#=> false2!=1#=> true# A false-on kívül, nil az egyetlen hamis érték!nil#=> true!false#=> true!0#=> false# Még több összehasonlítás1<10#=> true1>10#=> false2<=2#=> true2>=2#=> true# Logikai operátoroktrue&&false#=> falsetrue||false#=> true!true#=> false# A logikai operátoroknak alternatív verziójuk is van sokkal kisebb# precedenciával. Ezeket arra szánták, hogy több állítást összeláncoljanak# amíg egyikük igaz vagy hamis értékkel nem tér vissza.# `csinalj_valami_mast` csak akkor fut le, ha `csinalj_valamit` igaz értékkel# tért vissza.csinalj_valamit()andcsinalj_valami_mast()# `log_error` csak akkor fut le, ha `csinalj_valamit` hamis értékkel# tért vissza.csinalj_valamit()orlog_error()# A sztringek objektumok'Én egy sztring vagyok'.class#=> String"Én is egy sztring vagyok".class#=> Stringhelykitolto='interpolációt használhatok'"Sztring #{helykitolto}, ha dupla időzőjelben van a sztringem"#=> "Sztring interpolációt használhatok, ha dupla időzőjelben van a sztringem"# A szimpla idézőjelet preferáljuk, ahol csak lehet,# mert a dupla idézőjel extra számításokat végez.# Kombinálhatunk sztringeket, de nem számokkal'hello '+'world'#=> "hello world"'hello '+3#=> TypeError: can't convert Fixnum into String'hello '+3.to_s#=> "hello 3"# kiírás a kimenetreputs"Írok"# Változókx=25#=> 25x#=> 25# Értékadás az adott értékkel tér vissza# Ez azt jelenti, hogy használhatunk többszörös értékadást:x=y=10#=> 10x#=> 10y#=> 10# Konvencióból, snake_case változó neveket használjsnake_case=true# Leíró változó neveket használjut_a_projekt_gyokerehez='/jo/nev/'ut='/rossz/nev/'# A szimbólumok (objektumok)# A szimbólumok megváltoztathatatlan, újra felhasználható konstans,# mely belsőleg egész számként reprezentált. Sokszor sztring helyett használják,# hogy effektíven közvetítsünk konkrét, értelmes értékeket:fuggoben.class#=> Symbolstatusz=:fuggobenstatusz==:fuggoben#=> truestatusz=='fuggoben'#=> falsestatusz==:jovahagyott#=> false# Tömbök# Ez egy tömbtomb=[1,2,3,4,5]#=> [1, 2, 3, 4, 5]# A tömmbök különböző tipusú dolgokat tartalmazhat[1,'hello',false]#=> [1, "hello", false]# Tömbök indexelhetőek# Az elejérőltomb[0]#=> 1tomb[12]#=> nil# Akárcsak a számtani műveletek [var] hozzáférés# is csak szintaktikus cukor# a [] függvény hívására az objektumontomb.[]0#=> 1tomb.[]12#=> nil# A végérőltomb[-1]#=> 5# Kezdőértékkel és hosszaltomb[2,3]#=> [3, 4, 5]# Tömb megfordításaa=[1,2,3]a.reverse!#=> [3,2,1]# Vagy tartománnyaltomb[1..3]#=> [2, 3, 4]# Így adhatunk a tömbhöztomb<<6#=> [1, 2, 3, 4, 5, 6]# Vagy ígytomb.push(6)#=> [1, 2, 3, 4, 5, 6]# Ellenőrízük, hogy a tömb tartalmaz egy elemettomb.include?(1)#=> true# Hash-ek a ruby elsődleges szótárjai kulcs/érték párokkal# Hash-eket kapcsos zárójellel jelöljükhash={'szin'=>'zold','szam'=>5}hash.keys#=> ['szin', 'szam']# Hash-ekben könnyen kreshetünk a kulcs segítségével:hash['szin']#=> 'zold'hash['szam']#=> 5# Nem létező kulcsra keresve nil-t kapunk:hash['nincs itt semmi']#=> nil# Ruby 1.9-től, egy külnleges szintaxist is használhatunk a szimbólumot# használunk kulcsnakuj_hash={defcon:3,action:true}uj_hash.keys#=> [:defcon, :action]# Ellenőrizzük, hogy az adott kulcs és érték bene-e van a hash-benuj_hash.has_key?(:defcon)#=> trueuj_hash.has_value?(3)#=> true# Tip: A tömbök és hash-ek is felsorolhatóak# Sok közös függvényük van, akár az each, map, count, és több# Kontroll Struktúrákiftrue'ha állítás'elsiffalse'különben ha, opcionális'else'különben, szintén opcionális'endforszamlaloin1..5puts"iteracio #{szamlalo}"end#=> iteracio 1#=> iteracio 2#=> iteracio 3#=> iteracio 4#=> iteracio 5# HOWEVER, No-one uses for loops.# Instead you should use the "each" method and pass it a block.# A block is a bunch of code that you can pass to a method like "each".# It is analogous to lambdas, anonymous functions or closures in other# programming languages.## The "each" method of a range runs the block once for each element of the range.# The block is passed a counter as a parameter.# Calling the "each" method with a block looks like this:(1..5).eachdo|counter|puts"iteration #{counter}"end#=> iteration 1#=> iteration 2#=> iteration 3#=> iteration 4#=> iteration 5# You can also surround blocks in curly brackets:(1..5).each{|counter|puts"iteration #{counter}"}# The contents of data structures can also be iterated using each.array.eachdo|element|puts"#{element} is part of the array"endhash.eachdo|key,value|puts"#{key} is #{value}"endcounter=1whilecounter<=5doputs"iteration #{counter}"counter+=1end#=> iteration 1#=> iteration 2#=> iteration 3#=> iteration 4#=> iteration 5jegy='4'casejegywhen'5'puts'Kitünő'when'4'puts'Jó'when'3'puts'Közepes'when'2'puts'Elégsége'when'1'puts'Elégtelen'elseputs'Alternatív értékelés, hm?'end#=> "Jó"# case-ek tartományokat is használhatnakjegy=82casejegywhen90..100puts'Hurrá!'when80...90puts'Jó munka'elseputs'Megbuktál!'end#=> "Jó munka"# kivétel kezelés:begin# kód ami kivételt dobhatraiseNoMemoryError,'Megtelt a memória'rescueNoMemoryError=>kivetel_valtozoputs'NoMemoryError-t dobott',kivetel_valtozorescueRuntimeError=>mas_kivetel_valtozoputs'RuntimeError dobott most'elseputs'Ez akkor fut ha nem dob kivételt'ensureputs'Ez a kód mindenképpen lefut'end# Függvényekdefketszeres(x)x*2end# Függvények (és egyébb blokkok) implicit viszatértnek az utolsó értékkelketszeres(2)#=> 4# Zárójelezés opcionális, ha az eredmény félreérthetetlenketszeres3#=> 6ketszeresketszeres3#=> 12defosszeg(x,y)x+yend# Függvény argumentumait vesszővel választjuk el.osszeg3,4#=> 7osszegosszeg(3,4),5#=> 12# yield# Minden függvénynek van egy implicit, opcionális block paramétere# 'yield' kulcsszóval hívhatjukdefkorulveszputs'{'yieldputs'}'endkorulvesz{puts'hello world'}# {# hello world# }# Fuggvénynek átadhatunk blokkot# "&" jelöli az átadott blokk referenciájátdefvendegek(&block)block.call'valami_argumentum'end# Argumentum lisát is átadhatunk, ami tömbé lesz konvertálva# Erre való a splat operátor ("*")defvendegek(*array)array.each{|vendeg|putsvendeg}end# Osztályt a class kulcsszóval definiálhatunkclassEmber# Az osztály változó. Az osztály minden példánnyával megvan osztva@@faj='H. sapiens'# Alap inicializálódefinitialize(nev,kor=0)# Hozzárendeli az argumentumot a "nev" példány változóhoz@nev=nev# Ha nem adtunk meg kort akkor az alapértemezet értéket fogja használni@kor=korend# Alap setter függvénydefnev=(nev)@nev=nevend# Alap getter függvénydefnev@nevend# A fönti funkcionalítást az attr_accessor függvénnyel is elérhetjükattr_accessor:nev# Getter/setter függvények egyenként is kreálhatóakattr_reader:nevattr_writer:nev# Az osztály függvények "self"-et hasznalnak, hogy megkülönböztessék magukat a# példány függvényektől# Az osztályn hívhatóak, nem a példányondefself.mond(uzenet)putsuzenetenddeffaj@@fajendend# Példányosítsuk az osztálytjim=Ember.new('Jim Halpert')dwight=Ember.new('Dwight K. Schrute')# Hívjunk meg pár függvénytjim.faj#=> "H. sapiens"jim.nev#=> "Jim Halpert"jim.nev="Jim Halpert II"#=> "Jim Halpert II"jim.nev#=> "Jim Halpert II"dwight.faj#=> "H. sapiens"dwight.nev#=> "Dwight K. Schrute"# Hívjuk meg az osztály függvénytEmber.mond('Hi')#=> "Hi"# Változók szókjait az elnevezésük definiálja# $ kezdetű változók globálisak$var="Én egy globális változó vagyok"defined?$var#=> "global-variable"# Változók amik @-al kezdődnek példány szkópjuk van@var="Én egy példány változó vagyok"defined?@var#=> "instance-variable"# Változók amik @@-al kezdődnek példány szkópjuk van@@var="Én egy osztály változó vagyok"defined?@@var#=> "class variable"# Változók amik nagy betűvel kezdődnek a konstansokVar="Konstans vagyok"defined?Var#=> "constant"# Az osztály is objetum. Tehát az osztálynak lehet példány változója# Az osztályváltozón osztozik minden pédány és leszármazott# Ős osztályclassEmber@@foo=0defself.foo@@fooenddefself.foo=(ertek)@@foo=ertekendend# Leszarmazott osztályclassDolgozo<EmberendEmber.foo# 0Dolgozo.foo# 0Ember.foo=2# 2Dolgozo.foo# 2# Az osztálynak példány változóját nem látja az osztály leszármazottja.classEmber@bar=0defself.bar@barenddefself.bar=(ertek)@bar=ertekendendclassDoctor<EmberendEmber.bar# 0Doctor.bar# nilmoduleModulePeldadeffoo'foo'endend# Modulok include-olása a fügvényeiket az osztály példányaihoz köti.# Modulok extend-elésa a fügvényeiket magához az osztályhoz köti.classSzemelyincludeModulePeldaendclassKonyvextendModulePeldaendSzemely.foo# => NoMethodError: undefined method `foo' for Szemely:ClassSzemely.new.foo# => 'foo'Konyv.foo# => 'foo'Konyv.new.foo# => NoMethodError: undefined method `foo'# Callback-ek végrehajtódnak amikor include-olunk és extend-elünk egy modultmoduleConcernPeldadefself.included(base)base.extend(ClassMethods)base.send(:include,InstanceMethods)endmoduleClassMethodsdefbar'bar'endendmoduleInstanceMethodsdefqux'qux'endendendclassValamiincludeConcernPeldaendValami.bar# => 'bar'Valami.qux# => NoMethodError: undefined method `qux'Valami.new.bar# => NoMethodError: undefined method `bar'Valami.new.qux# => 'qux'