From 3015cfb4367ffe7e06df5232cb4aa5924194715d Mon Sep 17 00:00:00 2001 From: Leonardy Kristianto Date: Wed, 28 Oct 2015 02:14:13 +0800 Subject: Rename go.html.markdown to go-hu.html.markdown --- hu-hu/go-hu.html.markdown | 337 ++++++++++++++++++++++++++++++++++++++++++++++ hu-hu/go.html.markdown | 337 ---------------------------------------------- 2 files changed, 337 insertions(+), 337 deletions(-) create mode 100644 hu-hu/go-hu.html.markdown delete mode 100644 hu-hu/go.html.markdown (limited to 'hu-hu') diff --git a/hu-hu/go-hu.html.markdown b/hu-hu/go-hu.html.markdown new file mode 100644 index 00000000..638c9489 --- /dev/null +++ b/hu-hu/go-hu.html.markdown @@ -0,0 +1,337 @@ +--- +language: Go +lang: hu-hu +filename: learngo-hu.go +contributors: + - ["Sonia Keys", "https://github.com/soniakeys"] +translators: + - ["Szabó Krisztián", "https://github.com/thenonameguy/"] + - ["Árpád Goretity", "https://github.com/H2CO3"] +--- + +A Go programozási nyelv az életszerű feladatok könnyebb elvégzése miatt született. +A mai legújabb programozási trendeket elkerülve, +praktikus megoldást nyújt a valós, üzleti problémákra. + +C-szerű szintaktikával és statikus típuskezeléssel rendelkezik. +A fordító szempillantás alatt végez és egy gyorsan futó,statikus futtatható állományt hoz létre. +A nyelv könnyen érthető, folyamatok közötti csatornákon áthaladó üzenetekkel kommunikáló konkurens programozást tesz lehetővé, így könnyen ki lehet használni +a mai számítógépek több magos processzorait, ez nagy rendszerek építéséhez ideális. + +A Go alap könyvtára mindenre területre kiterjed, ennek köszönhetően a nyelvnek egyre növekvő tábora van. + +```go +// Egy soros komment +/* Több + soros komment */ + +// Minden forrás fájl egy csomag-definícióval kezdődik, ez hasonlít a Python +// csomagkezelésére +// A main egy különleges csomagnév, ennek a fordítása futtatható állományt hoz +// létre egy könyvtár helyett. +package main + +// Az import rész meghatározza melyik csomagokat kívánjuk használni ebben a +// forrásfájlban +import ( + "fmt" // A Go alap könyvtárának része + "net/http" // Beépített webszerver! + "strconv" // Stringek átalakítására szolgáló csomag +) + +// Függvénydeklarálás, a main nevű függvény a program kezdőpontja. +func main() { + // Println kiírja a beadott paramétereket a standard kimenetre. + // Ha más csomagot függvényeit akarjuk használni, akkor azt jelezni kell a + // csomag nevével + fmt.Println("Hello world!") + + // Meghívunk egy másik függvényt ebből a csomagból + beyondHello() +} + +// A függvények paraméterei zárójelek között vannak. +// Ha nincsenek paraméterek, akkor is kötelező a zárójel-pár. +func beyondHello() { + var x int // Változó deklaráció, használat előtt muszáj ezt megtenni. + x = 3 // Változó értékadás + // "Rövid" deklaráció is létezik, ez az érték alapján deklarálja, + // definiálja és értéket is ad a változónak + y := 4 + sum, prod := learnMultiple(x, y) // a függvényeknek több + // visszatérési értéke is lehet + fmt.Println("sum:", sum, "prod:", prod) // egyszerű kiíratás + learnTypes() +} + +// A funkcióknak elnevezett visszatérési értékük is lehet +func learnMultiple(x, y int) (sum, prod int) { + return x + y, x * y // visszatérünk két értékkel + /* + sum = x + y + prod = x * y + return + Ez ugyanezzel az eredménnyel járt volna, mint a fenti sor. + Üres return esetén, az elnevezett visszatérési változók + aktuális értékeikkel térnek vissza. */ +} + +// Beépített típusok +func learnTypes() { + // Rövid deklarálás az esetek többségében elég lesz a változókhoz + s := "Tanulj Go-t!" // string típus + + s2 := `A "nyers" stringekben lehetnek + újsorok is!` // de ettől még ez is ugyanolyan string mint az s, nincs külön + // típusa + + // nem ASCII karakterek. Minden Go forrás UTF-8 és a stringek is azok. + g := 'Σ' // rúna(rune) típus, megegyezik az uint32-vel, egy UTF-8 karaktert + // tárol + + f := 3.14195 // float64, az IEEE-754 szabványnak megfelelő 64-bites + // lebegőpontos szám + c := 3 + 4i // complex128, belsőleg két float64-gyel tárolva + + // Var szintaxis változótípus-definiálással + var u uint = 7 // unsigned, az implementáció dönti el mekkora, akárcsak az + // int-nél + var pi float32 = 22. / 7 + + // Rövid deklarásnál átalakítás is lehetséges + n := byte('\n') // byte típus, ami megegyezik az uint8-al + + // A tömböknek fordítás-időben fixált méretük van + var a4 [4]int // egy tömb 4 int-tel, mind 0-ra inicializálva + a3 := [...]int{3, 1, 5} // egy tömb 3 int-tel, láthatóan inicalizálva egyedi + // értékekre + + // A "szeleteknek" (slices) dinamikus a méretük. A szeleteknek és a tömböknek is + // megvannak az előnyeik de a szeleteket sokkal gyakrabban használjuk. + s3 := []int{4, 5, 9} // vesd össze a3-mal, nincsenek pontok. + s4 := make([]int, 4) // allokál 4 int-et, mind 0-ra inicializálva + var d2 [][]float64 // ez csak deklaráció, semmi sincs még allokálva + bs := []byte("a slice") // típus konverzió szintaxisa + + p, q := learnMemory() // deklarál két mutatót (p,q), két int-re + fmt.Println(*p, *q) // * követi a mutatót. Ez a sor kiírja a két int értékét. + + // A map a dinamikusan növelhető asszociatív tömb része a nyelvnek, hasonlít + // a hash és dictionary típusokra más nyelvekben. + m := map[string]int{"three": 3, "four": 4} + m["one"] = 1 + + // A felhasználatlan változók fordítás-idejű hibát okoznak a Go-ban. + // Az aláhúzással "használod" a változókat, de eldobod az értéküket. + _, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs + // Kiíratás is természetesen használatnak minősül + fmt.Println(s, c, a4, s3, d2, m) + + learnFlowControl() +} + +// A Go nyelvben szemétgyűjtés (garbage collection) működik. Megtalálhatók benne +// mutatók, de nincs pointeraritmetika. Ez azt jelenti, hogy üres (null) mutatóval még +// mindig hibázhatsz, de hozzáadni/műveleteket végezni már nem lehet. +func learnMemory() (p, q *int) { + // Elnevezett visszatérési változóknak int-re mutató a típusa + p = new(int) // a beépített "new" funkció, egy típusnak elegendő memóriát + // allokál, és visszaad rá egy mutatót. + // Az allokált int nullázva van, p többé nem üres mutató. + s := make([]int, 20) // allokáljunk 20 int változót egy memóriaterületen. + s[3] = 7 // adjunk értéket az egyiknek + r := -2 // hozzánk létre egy lokális változót + return &s[3], &r // A & megadja a memóriacímét a változónak +} + +func expensiveComputation() int { + return 1e6 +} + +func learnFlowControl() { + // Az elágazásoknak kötelező a kapcsos zárójel, a zárójel nem szükséges. + if true { + fmt.Println("megmondtam") + } + // A kód formátumát a nyelvvel járó "go" parancssori program "go fmt" + // parancsa szabványosítja + if false { + // így lehet + } else { + // if/else-t csinálni + } + // Használjunk switchet a hosszabb elágazások alkalmazása helyett. + x := 1 + switch x { + case 0: + case 1: + // Az "esetek" nem "esnek át", tehát + case 2: + // ez nem fog lefutni, nincs szükség break-ekre. + } + // A for ciklus sem használ zárójeleket + for x := 0; x < 3; x++ { + fmt.Println("iteráció", x) + } + // itt az x == 1. + + // A for az egyetlen ciklus fajta a Go-ban, de több formája van. + for { // végtelen ciklus + break // csak vicceltem + continue // soha nem fut le + } + + //Akárcsak a for-nál, az if-nél is lehet rövid deklarálással egy lokális változót létrehozni, + //ami a blokk összes if/else szerkezetén keresztül érvényes marad. + if y := expensiveComputation(); y > x { + x = y + } + // Függvényeket használhatjuk closure-ként is. + xBig := func() bool { + return x > 100 // a switch felett deklarált x-et használjuk itt + } + fmt.Println("xBig:", xBig()) // igaz (utoljára 1e6 lett az értéke az x-nek) + x /= 1e5 // így most már x == 10 + fmt.Println("xBig:", xBig()) // 10 pedig kisebb mint 100, tehát hamis + + // Ha nagyon-nagyon szükséges, akkor használhatjuk a jó öreg goto-t. + goto love +love: + + learnInterfaces() // Itt kezdődnek az érdekes dolgok! +} + +// Definiáljuk a Stringert egy olyan interfésznek, amelynek egy metódusa van, a +// String, ami visszatér egy stringgel. +type Stringer interface { + String() string +} + +// Definiáljuk a pair-t egy olyan struktúrának amelynek két int változója van, +// x és y. +type pair struct { + x, y int +} + +// Definiáljunk egy metódust a pair struktúrának, ezzel teljesítve a Stringer interfészt. +func (p pair) String() string { // p lesz a "fogadó" (receiver) + // Sprintf az fmt csomag egy publikus függvénye, műkődése megegyezik a C-s + // megfelelőjével. A pontokkal érjük el a mindenkori p struktúra elemeit + return fmt.Sprintf("(%d, %d)", p.x, p.y) +} + +func learnInterfaces() { + // A kapcsos zárójellel jelezzük, hogy egyből inicializálni + // szeretnénk a struktúra változóit a sorrendnek megfelelően. + p := pair{3, 4} + fmt.Println(p.String()) // meghívjuk a p String metódusát. + var i Stringer // deklaráljuk i-t Stringer típusú interfésznek + i = p // lehetséges, mert a pair struktúra eleget tesz a + // Stringer interfésznek + // Meghívjuk i String metódusát, az eredmény ugyanaz, mint az előbb. + fmt.Println(i.String()) + + // Az fmt csomag függvényei automatikusan meghívják a String függvényt + // hogy megtudják egy objektum szöveges reprezentációját. + fmt.Println(p) // ugyan az az eredmény mint az előbb, a Println meghívja + // a String metódust. + fmt.Println(i) // dettó + + learnErrorHandling() +} + +func learnErrorHandling() { + // ", ok" szokásos megoldás arra, hogy jól működött-e a függvény. + m := map[int]string{3: "three", 4: "four"} + if x, ok := m[1]; !ok { // ok hamis lesz, mert az 1 nincs benne a map-ban. + fmt.Println("nincs meg") + } else { + fmt.Print(x) // x lenne az érték, ha benne lenne a map-ban. + } + // A hiba érték többet is elmond a függvény kimeneteléről, mint hogy minden + // "ok" volt-e + if _, err := strconv.Atoi("non-int"); err != nil { // _ eldobja az értéket, + // úgy se lesz jó jelen + // esetben + // kiírja, hogy "strconv.ParseInt: parsing "non-int": invalid syntax" + fmt.Println(err) + } + // Az interfészekre még visszatérünk, addig is jöjjön a konkurens programozás! + learnConcurrency() +} + +// c egy csatorna, egy konkurens-biztos kommunikációs objektum. +func inc(i int, c chan int) { + c <- i + 1 // <- a "küldés" operátor, ha a bal oldalán csatorna van, így + // i+1-et küld be a csatornába +} + +// Az inc-et fogjuk arra használni, hogy konkurensen megnöveljünk számokat +func learnConcurrency() { + // Ugyanaz a make függvény, amivel korábban szeleteket hoztunk létre. + // A make allokál map-eket, szeleteket és csatornákat. + c := make(chan int) + // Indítsunk három konkurens goroutine-t. A számok konkurensen lesznek + // megnövelve, ha a számítógép képes rá és jól be van állítva, akkor pedig + // paralellizálva/egymás mellett. Mind a 3 ugyanabba a csatornába küldi az + // eredményeket. + go inc(0, c) // A go utasítás indít el goroutine-okat. + go inc(10, c) + go inc(-805, c) + // Beolvassuk 3x a csatornából az eredményeket és kiírjuk őket a kimenetre. + // Nem lehet tudni milyen sorrendben fognak érkezni az eredmények! + fmt.Println(<-c, <-c, <-c) // hogyha a jobb oldalon csatorna van, akkor a + // "<-" a beolvasó/kapó operátor + + cs := make(chan string) // még egy csatorna, ez stringekkel kommunikál + cc := make(chan chan string) // egy csatorna csatornával + go func() { c <- 84 }() // indítsunk egy új goroutine-t, csak azért + // hogy küldjünk egy számot + go func() { cs <- "wordy" }() // ugyanez, csak a cs csatornába stringet + // küldünk + // A select olyan mint a switch, csak feltételek helyett csatorna műveletek + // vannak. Véletlenszerűen kiválasztja az első olyan esetet, ahol létrejöhet + // kommunikáció. + select { + case i := <-c: // a megkapott értéket el lehet tárolni egy változóban + fmt.Println("ez egy", i) + case <-cs: // vagy el lehet dobni az értékét + fmt.Println("ez egy string volt") + case <-cc: // üres csatorna, soha nem fog rajta semmi se érkezni + fmt.Println("sose futok le :'( ") + } + // Ezen a ponton vagy c vagy a cs goroutine-ja lefutott. + // Amelyik hamarabb végzett, annak a megfelelő case-e lefutott, a másik + // blokkolva vár. + + learnWebProgramming() // a Go képes rá. Te is képes akarsz rá lenni. +} + +// Egy függvény a http csomagból elindít egy webszervert. +func learnWebProgramming() { + // A ListenAndServe első paramétre egy TCP port, amin kiszolgálunk majd. + // Második paramétere egy interfész, pontosabban a http.Handler interfész. + err := http.ListenAndServe(":8080", pair{}) + fmt.Println(err) // nem felejtjük el kiírni az esetleges hibákat! +} + +// Csináljunk a pair-ból egy http.Handler-t úgy, hogy implementáljuk az +// egyetlen metódusát, a ServeHTTP-t. +func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Minden kapcsolatra elküldjük ezt a http.ResponseWriter-rel + w.Write([]byte("Megtanultad a Go-t Y perc alatt!")) +} +``` + +## További olvasmányok + +Minden Go-val kapcsolatos megtaláható a [hivatalos Go weboldalon](http://golang.org/). +Ott követhetsz egy tutorialt, játszhatsz a nyelvvel az interneten, és sok érdekességet olvashatsz. + +A nyelv specifikációját kifejezetten érdemes olvasni, viszonylag rövid és sokat tanul belőle az ember. + +Ha pedig jobban bele akarod vetni magad a Go-ba, akkor a legjobb praktikákat kilesheted a standard könyvtárból. +TIPP: a dokumentációban kattints egy függvény nevére és rögtön megmutatja a hozzá tartozó kódot! + +Ha pedig a nyelvnek egy bizonyos részéről szeretnél hasonló leírást találni, akkor a +[gobyexample.com](https://gobyexample.com/)-on megtalálod, amit keresel. diff --git a/hu-hu/go.html.markdown b/hu-hu/go.html.markdown deleted file mode 100644 index 638c9489..00000000 --- a/hu-hu/go.html.markdown +++ /dev/null @@ -1,337 +0,0 @@ ---- -language: Go -lang: hu-hu -filename: learngo-hu.go -contributors: - - ["Sonia Keys", "https://github.com/soniakeys"] -translators: - - ["Szabó Krisztián", "https://github.com/thenonameguy/"] - - ["Árpád Goretity", "https://github.com/H2CO3"] ---- - -A Go programozási nyelv az életszerű feladatok könnyebb elvégzése miatt született. -A mai legújabb programozási trendeket elkerülve, -praktikus megoldást nyújt a valós, üzleti problémákra. - -C-szerű szintaktikával és statikus típuskezeléssel rendelkezik. -A fordító szempillantás alatt végez és egy gyorsan futó,statikus futtatható állományt hoz létre. -A nyelv könnyen érthető, folyamatok közötti csatornákon áthaladó üzenetekkel kommunikáló konkurens programozást tesz lehetővé, így könnyen ki lehet használni -a mai számítógépek több magos processzorait, ez nagy rendszerek építéséhez ideális. - -A Go alap könyvtára mindenre területre kiterjed, ennek köszönhetően a nyelvnek egyre növekvő tábora van. - -```go -// Egy soros komment -/* Több - soros komment */ - -// Minden forrás fájl egy csomag-definícióval kezdődik, ez hasonlít a Python -// csomagkezelésére -// A main egy különleges csomagnév, ennek a fordítása futtatható állományt hoz -// létre egy könyvtár helyett. -package main - -// Az import rész meghatározza melyik csomagokat kívánjuk használni ebben a -// forrásfájlban -import ( - "fmt" // A Go alap könyvtárának része - "net/http" // Beépített webszerver! - "strconv" // Stringek átalakítására szolgáló csomag -) - -// Függvénydeklarálás, a main nevű függvény a program kezdőpontja. -func main() { - // Println kiírja a beadott paramétereket a standard kimenetre. - // Ha más csomagot függvényeit akarjuk használni, akkor azt jelezni kell a - // csomag nevével - fmt.Println("Hello world!") - - // Meghívunk egy másik függvényt ebből a csomagból - beyondHello() -} - -// A függvények paraméterei zárójelek között vannak. -// Ha nincsenek paraméterek, akkor is kötelező a zárójel-pár. -func beyondHello() { - var x int // Változó deklaráció, használat előtt muszáj ezt megtenni. - x = 3 // Változó értékadás - // "Rövid" deklaráció is létezik, ez az érték alapján deklarálja, - // definiálja és értéket is ad a változónak - y := 4 - sum, prod := learnMultiple(x, y) // a függvényeknek több - // visszatérési értéke is lehet - fmt.Println("sum:", sum, "prod:", prod) // egyszerű kiíratás - learnTypes() -} - -// A funkcióknak elnevezett visszatérési értékük is lehet -func learnMultiple(x, y int) (sum, prod int) { - return x + y, x * y // visszatérünk két értékkel - /* - sum = x + y - prod = x * y - return - Ez ugyanezzel az eredménnyel járt volna, mint a fenti sor. - Üres return esetén, az elnevezett visszatérési változók - aktuális értékeikkel térnek vissza. */ -} - -// Beépített típusok -func learnTypes() { - // Rövid deklarálás az esetek többségében elég lesz a változókhoz - s := "Tanulj Go-t!" // string típus - - s2 := `A "nyers" stringekben lehetnek - újsorok is!` // de ettől még ez is ugyanolyan string mint az s, nincs külön - // típusa - - // nem ASCII karakterek. Minden Go forrás UTF-8 és a stringek is azok. - g := 'Σ' // rúna(rune) típus, megegyezik az uint32-vel, egy UTF-8 karaktert - // tárol - - f := 3.14195 // float64, az IEEE-754 szabványnak megfelelő 64-bites - // lebegőpontos szám - c := 3 + 4i // complex128, belsőleg két float64-gyel tárolva - - // Var szintaxis változótípus-definiálással - var u uint = 7 // unsigned, az implementáció dönti el mekkora, akárcsak az - // int-nél - var pi float32 = 22. / 7 - - // Rövid deklarásnál átalakítás is lehetséges - n := byte('\n') // byte típus, ami megegyezik az uint8-al - - // A tömböknek fordítás-időben fixált méretük van - var a4 [4]int // egy tömb 4 int-tel, mind 0-ra inicializálva - a3 := [...]int{3, 1, 5} // egy tömb 3 int-tel, láthatóan inicalizálva egyedi - // értékekre - - // A "szeleteknek" (slices) dinamikus a méretük. A szeleteknek és a tömböknek is - // megvannak az előnyeik de a szeleteket sokkal gyakrabban használjuk. - s3 := []int{4, 5, 9} // vesd össze a3-mal, nincsenek pontok. - s4 := make([]int, 4) // allokál 4 int-et, mind 0-ra inicializálva - var d2 [][]float64 // ez csak deklaráció, semmi sincs még allokálva - bs := []byte("a slice") // típus konverzió szintaxisa - - p, q := learnMemory() // deklarál két mutatót (p,q), két int-re - fmt.Println(*p, *q) // * követi a mutatót. Ez a sor kiírja a két int értékét. - - // A map a dinamikusan növelhető asszociatív tömb része a nyelvnek, hasonlít - // a hash és dictionary típusokra más nyelvekben. - m := map[string]int{"three": 3, "four": 4} - m["one"] = 1 - - // A felhasználatlan változók fordítás-idejű hibát okoznak a Go-ban. - // Az aláhúzással "használod" a változókat, de eldobod az értéküket. - _, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs - // Kiíratás is természetesen használatnak minősül - fmt.Println(s, c, a4, s3, d2, m) - - learnFlowControl() -} - -// A Go nyelvben szemétgyűjtés (garbage collection) működik. Megtalálhatók benne -// mutatók, de nincs pointeraritmetika. Ez azt jelenti, hogy üres (null) mutatóval még -// mindig hibázhatsz, de hozzáadni/műveleteket végezni már nem lehet. -func learnMemory() (p, q *int) { - // Elnevezett visszatérési változóknak int-re mutató a típusa - p = new(int) // a beépített "new" funkció, egy típusnak elegendő memóriát - // allokál, és visszaad rá egy mutatót. - // Az allokált int nullázva van, p többé nem üres mutató. - s := make([]int, 20) // allokáljunk 20 int változót egy memóriaterületen. - s[3] = 7 // adjunk értéket az egyiknek - r := -2 // hozzánk létre egy lokális változót - return &s[3], &r // A & megadja a memóriacímét a változónak -} - -func expensiveComputation() int { - return 1e6 -} - -func learnFlowControl() { - // Az elágazásoknak kötelező a kapcsos zárójel, a zárójel nem szükséges. - if true { - fmt.Println("megmondtam") - } - // A kód formátumát a nyelvvel járó "go" parancssori program "go fmt" - // parancsa szabványosítja - if false { - // így lehet - } else { - // if/else-t csinálni - } - // Használjunk switchet a hosszabb elágazások alkalmazása helyett. - x := 1 - switch x { - case 0: - case 1: - // Az "esetek" nem "esnek át", tehát - case 2: - // ez nem fog lefutni, nincs szükség break-ekre. - } - // A for ciklus sem használ zárójeleket - for x := 0; x < 3; x++ { - fmt.Println("iteráció", x) - } - // itt az x == 1. - - // A for az egyetlen ciklus fajta a Go-ban, de több formája van. - for { // végtelen ciklus - break // csak vicceltem - continue // soha nem fut le - } - - //Akárcsak a for-nál, az if-nél is lehet rövid deklarálással egy lokális változót létrehozni, - //ami a blokk összes if/else szerkezetén keresztül érvényes marad. - if y := expensiveComputation(); y > x { - x = y - } - // Függvényeket használhatjuk closure-ként is. - xBig := func() bool { - return x > 100 // a switch felett deklarált x-et használjuk itt - } - fmt.Println("xBig:", xBig()) // igaz (utoljára 1e6 lett az értéke az x-nek) - x /= 1e5 // így most már x == 10 - fmt.Println("xBig:", xBig()) // 10 pedig kisebb mint 100, tehát hamis - - // Ha nagyon-nagyon szükséges, akkor használhatjuk a jó öreg goto-t. - goto love -love: - - learnInterfaces() // Itt kezdődnek az érdekes dolgok! -} - -// Definiáljuk a Stringert egy olyan interfésznek, amelynek egy metódusa van, a -// String, ami visszatér egy stringgel. -type Stringer interface { - String() string -} - -// Definiáljuk a pair-t egy olyan struktúrának amelynek két int változója van, -// x és y. -type pair struct { - x, y int -} - -// Definiáljunk egy metódust a pair struktúrának, ezzel teljesítve a Stringer interfészt. -func (p pair) String() string { // p lesz a "fogadó" (receiver) - // Sprintf az fmt csomag egy publikus függvénye, műkődése megegyezik a C-s - // megfelelőjével. A pontokkal érjük el a mindenkori p struktúra elemeit - return fmt.Sprintf("(%d, %d)", p.x, p.y) -} - -func learnInterfaces() { - // A kapcsos zárójellel jelezzük, hogy egyből inicializálni - // szeretnénk a struktúra változóit a sorrendnek megfelelően. - p := pair{3, 4} - fmt.Println(p.String()) // meghívjuk a p String metódusát. - var i Stringer // deklaráljuk i-t Stringer típusú interfésznek - i = p // lehetséges, mert a pair struktúra eleget tesz a - // Stringer interfésznek - // Meghívjuk i String metódusát, az eredmény ugyanaz, mint az előbb. - fmt.Println(i.String()) - - // Az fmt csomag függvényei automatikusan meghívják a String függvényt - // hogy megtudják egy objektum szöveges reprezentációját. - fmt.Println(p) // ugyan az az eredmény mint az előbb, a Println meghívja - // a String metódust. - fmt.Println(i) // dettó - - learnErrorHandling() -} - -func learnErrorHandling() { - // ", ok" szokásos megoldás arra, hogy jól működött-e a függvény. - m := map[int]string{3: "three", 4: "four"} - if x, ok := m[1]; !ok { // ok hamis lesz, mert az 1 nincs benne a map-ban. - fmt.Println("nincs meg") - } else { - fmt.Print(x) // x lenne az érték, ha benne lenne a map-ban. - } - // A hiba érték többet is elmond a függvény kimeneteléről, mint hogy minden - // "ok" volt-e - if _, err := strconv.Atoi("non-int"); err != nil { // _ eldobja az értéket, - // úgy se lesz jó jelen - // esetben - // kiírja, hogy "strconv.ParseInt: parsing "non-int": invalid syntax" - fmt.Println(err) - } - // Az interfészekre még visszatérünk, addig is jöjjön a konkurens programozás! - learnConcurrency() -} - -// c egy csatorna, egy konkurens-biztos kommunikációs objektum. -func inc(i int, c chan int) { - c <- i + 1 // <- a "küldés" operátor, ha a bal oldalán csatorna van, így - // i+1-et küld be a csatornába -} - -// Az inc-et fogjuk arra használni, hogy konkurensen megnöveljünk számokat -func learnConcurrency() { - // Ugyanaz a make függvény, amivel korábban szeleteket hoztunk létre. - // A make allokál map-eket, szeleteket és csatornákat. - c := make(chan int) - // Indítsunk három konkurens goroutine-t. A számok konkurensen lesznek - // megnövelve, ha a számítógép képes rá és jól be van állítva, akkor pedig - // paralellizálva/egymás mellett. Mind a 3 ugyanabba a csatornába küldi az - // eredményeket. - go inc(0, c) // A go utasítás indít el goroutine-okat. - go inc(10, c) - go inc(-805, c) - // Beolvassuk 3x a csatornából az eredményeket és kiírjuk őket a kimenetre. - // Nem lehet tudni milyen sorrendben fognak érkezni az eredmények! - fmt.Println(<-c, <-c, <-c) // hogyha a jobb oldalon csatorna van, akkor a - // "<-" a beolvasó/kapó operátor - - cs := make(chan string) // még egy csatorna, ez stringekkel kommunikál - cc := make(chan chan string) // egy csatorna csatornával - go func() { c <- 84 }() // indítsunk egy új goroutine-t, csak azért - // hogy küldjünk egy számot - go func() { cs <- "wordy" }() // ugyanez, csak a cs csatornába stringet - // küldünk - // A select olyan mint a switch, csak feltételek helyett csatorna műveletek - // vannak. Véletlenszerűen kiválasztja az első olyan esetet, ahol létrejöhet - // kommunikáció. - select { - case i := <-c: // a megkapott értéket el lehet tárolni egy változóban - fmt.Println("ez egy", i) - case <-cs: // vagy el lehet dobni az értékét - fmt.Println("ez egy string volt") - case <-cc: // üres csatorna, soha nem fog rajta semmi se érkezni - fmt.Println("sose futok le :'( ") - } - // Ezen a ponton vagy c vagy a cs goroutine-ja lefutott. - // Amelyik hamarabb végzett, annak a megfelelő case-e lefutott, a másik - // blokkolva vár. - - learnWebProgramming() // a Go képes rá. Te is képes akarsz rá lenni. -} - -// Egy függvény a http csomagból elindít egy webszervert. -func learnWebProgramming() { - // A ListenAndServe első paramétre egy TCP port, amin kiszolgálunk majd. - // Második paramétere egy interfész, pontosabban a http.Handler interfész. - err := http.ListenAndServe(":8080", pair{}) - fmt.Println(err) // nem felejtjük el kiírni az esetleges hibákat! -} - -// Csináljunk a pair-ból egy http.Handler-t úgy, hogy implementáljuk az -// egyetlen metódusát, a ServeHTTP-t. -func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) { - // Minden kapcsolatra elküldjük ezt a http.ResponseWriter-rel - w.Write([]byte("Megtanultad a Go-t Y perc alatt!")) -} -``` - -## További olvasmányok - -Minden Go-val kapcsolatos megtaláható a [hivatalos Go weboldalon](http://golang.org/). -Ott követhetsz egy tutorialt, játszhatsz a nyelvvel az interneten, és sok érdekességet olvashatsz. - -A nyelv specifikációját kifejezetten érdemes olvasni, viszonylag rövid és sokat tanul belőle az ember. - -Ha pedig jobban bele akarod vetni magad a Go-ba, akkor a legjobb praktikákat kilesheted a standard könyvtárból. -TIPP: a dokumentációban kattints egy függvény nevére és rögtön megmutatja a hozzá tartozó kódot! - -Ha pedig a nyelvnek egy bizonyos részéről szeretnél hasonló leírást találni, akkor a -[gobyexample.com](https://gobyexample.com/)-on megtalálod, amit keresel. -- cgit v1.2.3 From f1d18e7e493c468f372598620837fedfb07271bf Mon Sep 17 00:00:00 2001 From: Leonardy Kristianto Date: Wed, 28 Oct 2015 02:14:30 +0800 Subject: Rename ruby.html.markdown to ruby-hu.html.markdown --- hu-hu/ruby-hu.html.markdown | 555 ++++++++++++++++++++++++++++++++++++++++++++ hu-hu/ruby.html.markdown | 555 -------------------------------------------- 2 files changed, 555 insertions(+), 555 deletions(-) create mode 100644 hu-hu/ruby-hu.html.markdown delete mode 100644 hu-hu/ruby.html.markdown (limited to 'hu-hu') diff --git a/hu-hu/ruby-hu.html.markdown b/hu-hu/ruby-hu.html.markdown new file mode 100644 index 00000000..169f2b8e --- /dev/null +++ b/hu-hu/ruby-hu.html.markdown @@ -0,0 +1,555 @@ +--- +language: ruby +lang: hu-hu +filenev: learnruby.rb +contributors: + - ["David Underwood", "http://theflyingdeveloper.com"] + - ["Joel Walden", "http://joelwalden.net"] + - ["Luke Holder", "http://twitter.com/lukeholder"] + - ["Tristan Hume", "http://thume.ca/"] + - ["Nick LaMuro", "https://github.com/NickLaMuro"] + - ["Marcos Brizeno", "http://www.about.me/marcosbrizeno"] + - ["Ariel Krakowski", "http://www.learneroo.com"] + - ["Dzianis Dashkevich", "https://github.com/dskecse"] + - ["Levi Bostian", "https://github.com/levibostian"] + - ["Rahil Momin", "https://github.com/iamrahil"] + translators: + - ["Zsolt Prontvai", "https://github.com/prozsolt"] +--- + +```ruby +# 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 objektumok + +3.class #=> Fixnum + +3.to_s #=> "3" + + +# Néhány alapvető számtani művelet +1 + 1 #=> 2 +8 - 1 #=> 7 +10 * 2 #=> 20 +35 / 5 #=> 7 +2**5 #=> 32 + +# A számtani művelet csak szintaktikus cukor +# az objektumon történő függvény hívásra +1.+(3) #=> 4 +10.* 5 #=> 50 + +# A speciális értékek objektumok +nil # Nincs itt semmi látnivaló +true # igaz +false # hamis + +nil.class #=> NilClass +true.class #=> TrueClass +false.class #=> FalseClass + +# Egyenlőség +1 == 1 #=> true +2 == 1 #=> false + +# Egyenlőtlenség +1 != 1 #=> false +2 != 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ás +1 < 10 #=> true +1 > 10 #=> false +2 <= 2 #=> true +2 >= 2 #=> true + +# Logikai operátorok +true && false #=> false +true || 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() and csinalj_valami_mast() +# `log_error` csak akkor fut le, ha `csinalj_valamit` hamis értékkel +# tért vissza. +csinalj_valamit() or log_error() + + +# A sztringek objektumok + +'Én egy sztring vagyok'.class #=> String +"Én is egy sztring vagyok".class #=> String + +helykitolto = '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 kimenetre +puts "Írok" + +# Változók +x = 25 #=> 25 +x #=> 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 #=> 10 +x #=> 10 +y #=> 10 + +# Konvencióból, snake_case változó neveket használj +snake_case = true + +# Leíró változó neveket használj +ut_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 #=> Symbol + +statusz = :fuggoben + +statusz == :fuggoben #=> true + +statusz == 'fuggoben' #=> false + +statusz == :jovahagyott #=> false + +# Tömbök + +# Ez egy tömb +tomb = [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ől +tomb[0] #=> 1 +tomb[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 objektumon +tomb.[] 0 #=> 1 +tomb.[] 12 #=> nil + +# A végéről +tomb[-1] #=> 5 + +# Kezdőértékkel és hosszal +tomb[2, 3] #=> [3, 4, 5] + +# Tömb megfordítása +a=[1,2,3] +a.reverse! #=> [3,2,1] + +# Vagy tartománnyal +tomb[1..3] #=> [2, 3, 4] + +# Így adhatunk a tömbhöz +tomb << 6 #=> [1, 2, 3, 4, 5, 6] +# Vagy így +tomb.push(6) #=> [1, 2, 3, 4, 5, 6] + +# Ellenőrízük, hogy a tömb tartalmaz egy elemet +tomb.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ük +hash = { '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 kulcsnak + +uj_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-ben +uj_hash.has_key?(:defcon) #=> true +uj_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ák + +if true + 'ha állítás' +elsif false + 'különben ha, opcionális' +else + 'különben, szintén opcionális' +end + +for szamlalo in 1..5 + puts "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).each do |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.each do |element| + puts "#{element} is part of the array" +end +hash.each do |key, value| + puts "#{key} is #{value}" +end + +counter = 1 +while counter <= 5 do + puts "iteration #{counter}" + counter += 1 +end +#=> iteration 1 +#=> iteration 2 +#=> iteration 3 +#=> iteration 4 +#=> iteration 5 + +jegy = '4' + +case jegy +when '5' + puts 'Kitünő' +when '4' + puts 'Jó' +when '3' + puts 'Közepes' +when '2' + puts 'Elégsége' +when '1' + puts 'Elégtelen' +else + puts 'Alternatív értékelés, hm?' +end +#=> "Jó" + +# case-ek tartományokat is használhatnak +jegy = 82 +case jegy +when 90..100 + puts 'Hurrá!' +when 80...90 + puts 'Jó munka' +else + puts 'Megbuktál!' +end +#=> "Jó munka" + +# kivétel kezelés: +begin + # kód ami kivételt dobhat + raise NoMemoryError, 'Megtelt a memória' +rescue NoMemoryError => kivetel_valtozo + puts 'NoMemoryError-t dobott', kivetel_valtozo +rescue RuntimeError => mas_kivetel_valtozo + puts 'RuntimeError dobott most' +else + puts 'Ez akkor fut ha nem dob kivételt' +ensure + puts 'Ez a kód mindenképpen lefut' +end + +# Függvények + +def ketszeres(x) + x * 2 +end + +# Függvények (és egyébb blokkok) implicit viszatértnek az utolsó értékkel +ketszeres(2) #=> 4 + +# Zárójelezés opcionális, ha az eredmény félreérthetetlen +ketszeres 3 #=> 6 + +ketszeres ketszeres 3 #=> 12 + +def osszeg(x, y) + x + y +end + +# Függvény argumentumait vesszővel választjuk el. +osszeg 3, 4 #=> 7 + +osszeg osszeg(3, 4), 5 #=> 12 + +# yield +# Minden függvénynek van egy implicit, opcionális block paramétere +# 'yield' kulcsszóval hívhatjuk + +def korulvesz + puts '{' + yield + puts '}' +end + +korulvesz { puts 'hello world' } + +# { +# hello world +# } + + +# Fuggvénynek átadhatunk blokkot +# "&" jelöli az átadott blokk referenciáját +def vendegek(&block) + block.call 'valami_argumentum' +end + +# Argumentum lisát is átadhatunk, ami tömbé lesz konvertálva +# Erre való a splat operátor ("*") +def vendegek(*array) + array.each { |vendeg| puts vendeg } +end + +# Osztályt a class kulcsszóval definiálhatunk +class Ember + + # Az osztály változó. Az osztály minden példánnyával megvan osztva + @@faj = 'H. sapiens' + + # Alap inicializáló + def initialize(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 = kor + end + + # Alap setter függvény + def nev=(nev) + @nev = nev + end + + # Alap getter függvény + def nev + @nev + end + + # A fönti funkcionalítást az attr_accessor függvénnyel is elérhetjük + attr_accessor :nev + + # Getter/setter függvények egyenként is kreálhatóak + attr_reader :nev + attr_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ányon + def self.mond(uzenet) + puts uzenet + end + + def faj + @@faj + end +end + + +# Példányosítsuk az osztályt +jim = Ember.new('Jim Halpert') + +dwight = Ember.new('Dwight K. Schrute') + +# Hívjunk meg pár függvényt +jim.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ényt +Ember.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 konstansok +Var = "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ály +class Ember + @@foo = 0 + + def self.foo + @@foo + end + + def self.foo=(ertek) + @@foo = ertek + end +end + +# Leszarmazott osztály +class Dolgozo < Ember +end + +Ember.foo # 0 +Dolgozo.foo # 0 + +Ember.foo = 2 # 2 +Dolgozo.foo # 2 + +# Az osztálynak példány változóját nem látja az osztály leszármazottja. + +class Ember + @bar = 0 + + def self.bar + @bar + end + + def self.bar=(ertek) + @bar = ertek + end +end + +class Doctor < Ember +end + +Ember.bar # 0 +Doctor.bar # nil + +module ModulePelda + def foo + 'foo' + end +end + +# 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. + +class Szemely + include ModulePelda +end + +class Konyv + extend ModulePelda +end + +Szemely.foo # => NoMethodError: undefined method `foo' for Szemely:Class +Szemely.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 modult + +module ConcernPelda + def self.included(base) + base.extend(ClassMethods) + base.send(:include, InstanceMethods) + end + + module ClassMethods + def bar + 'bar' + end + end + + module InstanceMethods + def qux + 'qux' + end + end +end + +class Valami + include ConcernPelda +end + +Valami.bar # => 'bar' +Valami.qux # => NoMethodError: undefined method `qux' +Valami.new.bar # => NoMethodError: undefined method `bar' +Valami.new.qux # => 'qux' +``` + +## Egyéb források + +- [Learn Ruby by Example with Challenges](http://www.learneroo.com/modules/61/nodes/338) +- [Official Documentation](http://www.ruby-doc.org/core-2.1.1/) +- [Ruby from other languages](https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/) +- [Programming Ruby](http://www.amazon.com/Programming-Ruby-1-9-2-0-Programmers/dp/1937785491/) - A régebbi [ingyenes változat](http://ruby-doc.com/docs/ProgrammingRuby/) elérhető online. +- [Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide) diff --git a/hu-hu/ruby.html.markdown b/hu-hu/ruby.html.markdown deleted file mode 100644 index 169f2b8e..00000000 --- a/hu-hu/ruby.html.markdown +++ /dev/null @@ -1,555 +0,0 @@ ---- -language: ruby -lang: hu-hu -filenev: learnruby.rb -contributors: - - ["David Underwood", "http://theflyingdeveloper.com"] - - ["Joel Walden", "http://joelwalden.net"] - - ["Luke Holder", "http://twitter.com/lukeholder"] - - ["Tristan Hume", "http://thume.ca/"] - - ["Nick LaMuro", "https://github.com/NickLaMuro"] - - ["Marcos Brizeno", "http://www.about.me/marcosbrizeno"] - - ["Ariel Krakowski", "http://www.learneroo.com"] - - ["Dzianis Dashkevich", "https://github.com/dskecse"] - - ["Levi Bostian", "https://github.com/levibostian"] - - ["Rahil Momin", "https://github.com/iamrahil"] - translators: - - ["Zsolt Prontvai", "https://github.com/prozsolt"] ---- - -```ruby -# 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 objektumok - -3.class #=> Fixnum - -3.to_s #=> "3" - - -# Néhány alapvető számtani művelet -1 + 1 #=> 2 -8 - 1 #=> 7 -10 * 2 #=> 20 -35 / 5 #=> 7 -2**5 #=> 32 - -# A számtani művelet csak szintaktikus cukor -# az objektumon történő függvény hívásra -1.+(3) #=> 4 -10.* 5 #=> 50 - -# A speciális értékek objektumok -nil # Nincs itt semmi látnivaló -true # igaz -false # hamis - -nil.class #=> NilClass -true.class #=> TrueClass -false.class #=> FalseClass - -# Egyenlőség -1 == 1 #=> true -2 == 1 #=> false - -# Egyenlőtlenség -1 != 1 #=> false -2 != 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ás -1 < 10 #=> true -1 > 10 #=> false -2 <= 2 #=> true -2 >= 2 #=> true - -# Logikai operátorok -true && false #=> false -true || 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() and csinalj_valami_mast() -# `log_error` csak akkor fut le, ha `csinalj_valamit` hamis értékkel -# tért vissza. -csinalj_valamit() or log_error() - - -# A sztringek objektumok - -'Én egy sztring vagyok'.class #=> String -"Én is egy sztring vagyok".class #=> String - -helykitolto = '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 kimenetre -puts "Írok" - -# Változók -x = 25 #=> 25 -x #=> 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 #=> 10 -x #=> 10 -y #=> 10 - -# Konvencióból, snake_case változó neveket használj -snake_case = true - -# Leíró változó neveket használj -ut_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 #=> Symbol - -statusz = :fuggoben - -statusz == :fuggoben #=> true - -statusz == 'fuggoben' #=> false - -statusz == :jovahagyott #=> false - -# Tömbök - -# Ez egy tömb -tomb = [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ől -tomb[0] #=> 1 -tomb[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 objektumon -tomb.[] 0 #=> 1 -tomb.[] 12 #=> nil - -# A végéről -tomb[-1] #=> 5 - -# Kezdőértékkel és hosszal -tomb[2, 3] #=> [3, 4, 5] - -# Tömb megfordítása -a=[1,2,3] -a.reverse! #=> [3,2,1] - -# Vagy tartománnyal -tomb[1..3] #=> [2, 3, 4] - -# Így adhatunk a tömbhöz -tomb << 6 #=> [1, 2, 3, 4, 5, 6] -# Vagy így -tomb.push(6) #=> [1, 2, 3, 4, 5, 6] - -# Ellenőrízük, hogy a tömb tartalmaz egy elemet -tomb.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ük -hash = { '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 kulcsnak - -uj_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-ben -uj_hash.has_key?(:defcon) #=> true -uj_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ák - -if true - 'ha állítás' -elsif false - 'különben ha, opcionális' -else - 'különben, szintén opcionális' -end - -for szamlalo in 1..5 - puts "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).each do |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.each do |element| - puts "#{element} is part of the array" -end -hash.each do |key, value| - puts "#{key} is #{value}" -end - -counter = 1 -while counter <= 5 do - puts "iteration #{counter}" - counter += 1 -end -#=> iteration 1 -#=> iteration 2 -#=> iteration 3 -#=> iteration 4 -#=> iteration 5 - -jegy = '4' - -case jegy -when '5' - puts 'Kitünő' -when '4' - puts 'Jó' -when '3' - puts 'Közepes' -when '2' - puts 'Elégsége' -when '1' - puts 'Elégtelen' -else - puts 'Alternatív értékelés, hm?' -end -#=> "Jó" - -# case-ek tartományokat is használhatnak -jegy = 82 -case jegy -when 90..100 - puts 'Hurrá!' -when 80...90 - puts 'Jó munka' -else - puts 'Megbuktál!' -end -#=> "Jó munka" - -# kivétel kezelés: -begin - # kód ami kivételt dobhat - raise NoMemoryError, 'Megtelt a memória' -rescue NoMemoryError => kivetel_valtozo - puts 'NoMemoryError-t dobott', kivetel_valtozo -rescue RuntimeError => mas_kivetel_valtozo - puts 'RuntimeError dobott most' -else - puts 'Ez akkor fut ha nem dob kivételt' -ensure - puts 'Ez a kód mindenképpen lefut' -end - -# Függvények - -def ketszeres(x) - x * 2 -end - -# Függvények (és egyébb blokkok) implicit viszatértnek az utolsó értékkel -ketszeres(2) #=> 4 - -# Zárójelezés opcionális, ha az eredmény félreérthetetlen -ketszeres 3 #=> 6 - -ketszeres ketszeres 3 #=> 12 - -def osszeg(x, y) - x + y -end - -# Függvény argumentumait vesszővel választjuk el. -osszeg 3, 4 #=> 7 - -osszeg osszeg(3, 4), 5 #=> 12 - -# yield -# Minden függvénynek van egy implicit, opcionális block paramétere -# 'yield' kulcsszóval hívhatjuk - -def korulvesz - puts '{' - yield - puts '}' -end - -korulvesz { puts 'hello world' } - -# { -# hello world -# } - - -# Fuggvénynek átadhatunk blokkot -# "&" jelöli az átadott blokk referenciáját -def vendegek(&block) - block.call 'valami_argumentum' -end - -# Argumentum lisát is átadhatunk, ami tömbé lesz konvertálva -# Erre való a splat operátor ("*") -def vendegek(*array) - array.each { |vendeg| puts vendeg } -end - -# Osztályt a class kulcsszóval definiálhatunk -class Ember - - # Az osztály változó. Az osztály minden példánnyával megvan osztva - @@faj = 'H. sapiens' - - # Alap inicializáló - def initialize(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 = kor - end - - # Alap setter függvény - def nev=(nev) - @nev = nev - end - - # Alap getter függvény - def nev - @nev - end - - # A fönti funkcionalítást az attr_accessor függvénnyel is elérhetjük - attr_accessor :nev - - # Getter/setter függvények egyenként is kreálhatóak - attr_reader :nev - attr_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ányon - def self.mond(uzenet) - puts uzenet - end - - def faj - @@faj - end -end - - -# Példányosítsuk az osztályt -jim = Ember.new('Jim Halpert') - -dwight = Ember.new('Dwight K. Schrute') - -# Hívjunk meg pár függvényt -jim.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ényt -Ember.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 konstansok -Var = "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ály -class Ember - @@foo = 0 - - def self.foo - @@foo - end - - def self.foo=(ertek) - @@foo = ertek - end -end - -# Leszarmazott osztály -class Dolgozo < Ember -end - -Ember.foo # 0 -Dolgozo.foo # 0 - -Ember.foo = 2 # 2 -Dolgozo.foo # 2 - -# Az osztálynak példány változóját nem látja az osztály leszármazottja. - -class Ember - @bar = 0 - - def self.bar - @bar - end - - def self.bar=(ertek) - @bar = ertek - end -end - -class Doctor < Ember -end - -Ember.bar # 0 -Doctor.bar # nil - -module ModulePelda - def foo - 'foo' - end -end - -# 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. - -class Szemely - include ModulePelda -end - -class Konyv - extend ModulePelda -end - -Szemely.foo # => NoMethodError: undefined method `foo' for Szemely:Class -Szemely.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 modult - -module ConcernPelda - def self.included(base) - base.extend(ClassMethods) - base.send(:include, InstanceMethods) - end - - module ClassMethods - def bar - 'bar' - end - end - - module InstanceMethods - def qux - 'qux' - end - end -end - -class Valami - include ConcernPelda -end - -Valami.bar # => 'bar' -Valami.qux # => NoMethodError: undefined method `qux' -Valami.new.bar # => NoMethodError: undefined method `bar' -Valami.new.qux # => 'qux' -``` - -## Egyéb források - -- [Learn Ruby by Example with Challenges](http://www.learneroo.com/modules/61/nodes/338) -- [Official Documentation](http://www.ruby-doc.org/core-2.1.1/) -- [Ruby from other languages](https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/) -- [Programming Ruby](http://www.amazon.com/Programming-Ruby-1-9-2-0-Programmers/dp/1937785491/) - A régebbi [ingyenes változat](http://ruby-doc.com/docs/ProgrammingRuby/) elérhető online. -- [Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide) -- cgit v1.2.3