1
0
mirror of https://github.com/adambard/learnxinyminutes-docs.git synced 2025-09-03 11:43:12 +02:00

Simplify language codes in directories

This commit is contained in:
Boris Verkhovskiy
2024-12-08 20:29:09 -07:00
parent 3da692272f
commit 912da583da
489 changed files with 0 additions and 0 deletions

107
hu/coffeescript.md Normal file
View File

@@ -0,0 +1,107 @@
---
language: CoffeeScript
contributors:
- ["Tenor Biel", "http://github.com/L8D"]
- ["Xavier Yao", "http://github.com/xavieryao"]
translators:
- ["Tamás Diószegi", "http://github.com/ditam"]
lang: hu-hu
filename: coffeescript-hu.coffee
---
A CoffeeScript egy apró nyelv ami egy-az-egyben egyenértékű JavaScript kódra fordul, és így futásidőben már nem szükséges interpretálni.
Mint a JavaScript egyik követője, a CoffeeScript mindent megtesz azért, hogy olvasható, jól formázott és jól futó JavaScript kódot állítson elő, ami minden JavaScript futtatókörnyezetben jól működik.
Rézletekért lásd még a [CoffeeScript weboldalát](http://coffeescript.org/), ahol egy teljes CoffeScript tutorial is található.
```coffeescript
# A CoffeeScript egy hipszter nyelv.
# Követi több modern nyelv trendjeit.
# Így a kommentek, mint Ruby-ban és Python-ban, a szám szimbólummal kezdődnek.
###
A komment blokkok ilyenek, és közvetlenül '/ *' és '* /' jelekre fordítódnak
az eredményül kapott JavaScript kódban.
Mielőtt tovább olvasol, jobb, ha a JavaScript alapvető szemantikájával
tisztában vagy.
(A kód példák alatt kommentként látható a fordítás után kapott JavaScript kód.)
###
# Értékadás:
number = 42 #=> var number = 42;
opposite = true #=> var opposite = true;
# Feltételes utasítások:
number = -42 if opposite #=> if(opposite) { number = -42; }
# Függvények:
square = (x) -> x * x #=> var square = function(x) { return x * x; }
fill = (container, liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
#=>var fill;
#
#fill = function(container, liquid) {
# if (liquid == null) {
# liquid = "coffee";
# }
# return "Filling the " + container + " with " + liquid + "...";
#};
# Szám tartományok:
list = [1..5] #=> var list = [1, 2, 3, 4, 5];
# Objektumok:
math =
root: Math.sqrt
square: square
cube: (x) -> x * square x
#=> var math = {
# "root": Math.sqrt,
# "square": square,
# "cube": function(x) { return x * square(x); }
# };
# "Splat" jellegű függvény-paraméterek:
race = (winner, runners...) ->
print winner, runners
#=>race = function() {
# var runners, winner;
# winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
# return print(winner, runners);
# };
# Létezés-vizsgálat:
alert "I knew it!" if elvis?
#=> if(typeof elvis !== "undefined" && elvis !== null) { alert("I knew it!"); }
# Tömb értelmezések: (array comprehensions)
cubes = (math.cube num for num in list)
#=>cubes = (function() {
# var _i, _len, _results;
# _results = [];
# for (_i = 0, _len = list.length; _i < _len; _i++) {
# num = list[_i];
# _results.push(math.cube(num));
# }
# return _results;
# })();
foods = ['broccoli', 'spinach', 'chocolate']
eat food for food in foods when food isnt 'chocolate'
#=>foods = ['broccoli', 'spinach', 'chocolate'];
#
#for (_k = 0, _len2 = foods.length; _k < _len2; _k++) {
# food = foods[_k];
# if (food !== 'chocolate') {
# eat(food);
# }
#}
```
## További források
- [Smooth CoffeeScript](http://autotelicum.github.io/Smooth-CoffeeScript/)
- [CoffeeScript Ristretto](https://leanpub.com/coffeescript-ristretto/read)

337
hu/go.md Normal file
View File

@@ -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.14159 // 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](https://go.dev/).
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.

812
hu/pythonlegacy.md Normal file
View File

@@ -0,0 +1,812 @@
---
language: Python 2 (legacy)
contributors:
- ["Louie Dinh", "http://ldinh.ca"]
- ["Amin Bandali", "https://aminb.org"]
- ["Andre Polykanine", "https://github.com/Oire"]
- ["evuez", "http://github.com/evuez"]
- ["asyne", "https://github.com/justblah"]
- ["habi", "http://github.com/habi"]
translators:
- ["Tamás Diószegi", "https://github.com/ditam"]
filename: learnpythonlegacy-hu.py
lang: hu-hu
---
A Python nyelvet Guido Van Rossum alkotta meg a 90-es évek elején. Manapság az
egyik legnépszerűbb programozási nyelv. Én a tiszta szintaxisa miatt szerettem
bele. Tulajdonképpen futtatható pszeudokód.
Figyelem: ez a leírás a Python 2.7 verziójára vonatkozik, illetve
általánosságban a 2.x verziókra. A Python 2.7 azonban már csak 2020-ig lesz
támogatva, ezért kezdőknek ajánlott, hogy a Python 3-mal kezdjék az
ismerkedést. A Python 3.x verzióihoz a [Python 3 bemutató](http://learnxinyminutes.com/docs/python/)
ajánlott.
Lehetséges olyan Python kódot írni, ami egyszerre kompatibilis a 2.7 és a 3.x
verziókkal is, a Python [`__future__` imports](https://docs.python.org/2/library/__future__.html) használatával.
A `__future__` import használata esetén Python 3-ban írhatod a kódot, ami
Python 2 alatt is futni fog, így ismét a fenti Python 3 bemutató ajánlott.
```python
# Az egysoros kommentek kettőskereszttel kezdődnek
""" Többsoros stringeket három darab " közé
fogva lehet írni, ezeket gyakran használják
több soros kommentként.
"""
####################################################
# 1. Egyszerű adattípusok és operátorok
####################################################
# Használhatsz számokat
3 # => 3
# Az alapműveletek meglepetésektől mentesek
1 + 1 # => 2
8 - 1 # => 7
10 * 2 # => 20
35 / 5 # => 7
# Az osztás kicsit trükkös. Egész osztást végez, és a hányados alsó egész része
# lesz az eredmény
5 / 2 # => 2
# Az osztás kijavításához a (lebegőpontos) float típust kell használnunk
2.0 # Ez egy float
11.0 / 4.0 # => 2.75 áh... máris jobb
# Az egész osztás a negatív számok esetén is az alsó egész részt eredményezi
5 // 3 # => 1
5.0 // 3.0 # => 1.0 # floatok esetén is
-5 // 3 # => -2
-5.0 // 3.0 # => -2.0
# Ha importáljuk a division modult (ld. 6. Modulok rész),
# akkor a '/' jellel pontos osztást tudunk végezni.
from __future__ import division
11 / 4 # => 2.75 ...sima osztás
11 // 4 # => 2 ...egész osztás
# Modulo művelet
7 % 3 # => 1
# Hatványozás (x az y. hatványra)
2 ** 4 # => 16
# A precedencia zárójelekkel befolyásolható
(1 + 3) * 2 # => 8
# Logikai operátorok
# Megjegyzés: az "and" és "or" csak kisbetűkkel helyes
True and False # => False
False or True # => True
# A logikai operátorok egészeken is használhatóak
0 and 2 # => 0
-5 or 0 # => -5
0 == False # => True
2 == True # => False
1 == True # => True
# Negálni a not kulcsszóval lehet
not True # => False
not False # => True
# Egyenlőségvizsgálat ==
1 == 1 # => True
2 == 1 # => False
# Egyenlőtlenség !=
1 != 1 # => False
2 != 1 # => True
# További összehasonlítások
1 < 10 # => True
1 > 10 # => False
2 <= 2 # => True
2 >= 2 # => True
# Az összehasonlítások láncolhatóak!
1 < 2 < 3 # => True
2 < 3 < 2 # => False
# Stringeket " vagy ' jelek közt lehet megadni
"Ez egy string."
'Ez egy másik string.'
# A stringek összeadhatóak!
"Hello " + "world!" # => "Hello world!"
# '+' jel nélkül is összeadhatóak
"Hello " "world!" # => "Hello world!"
# ... illetve szorozhatóak
"Hello" * 3 # => "HelloHelloHello"
# Kezelhető karakterek indexelhető listájaként
"This is a string"[0] # => 'T'
# A string hosszát a len függvény adja meg
len("This is a string") # => 16
# String formázáshoz a % jel használható
# A Python 3.1-gyel a % már deprecated jelölésű, és később eltávolításra fog
# kerülni, de azért jó tudni, hogyan működik.
x = 'alma'
y = 'citrom'
z = "A kosárban levő elemek: %s és %s" % (x, y)
# A string formázás újabb módja a format metódus használatával történik.
# Jelenleg ez a javasolt megoldás.
"{} egy {} szöveg".format("Ez", "helytartó")
"A {0} pedig {1}".format("string", "formázható")
# Ha nem akarsz számolgatni, nevesíthetőek a pozíciók.
"{name} kedvence a {food}".format(name="Bob", food="lasagna")
# None egy objektum
None # => None
# A None-nal való összehasonlításhoz ne használd a "==" jelet,
# használd az "is" kulcsszót helyette
"etc" is None # => False
None is None # => True
# Az 'is' operátor objektum egyezést vizsgál.
# Primitív típusok esetén ez nem túl hasznos,
# objektumok esetén azonban annál inkább.
# Bármilyen objektum használható logikai kontextusban.
# A következő értékek hamis-ra értékelődnek ki (ún. "falsey" értékek):
# - None
# - bármelyik szám típus 0 értéke (pl. 0, 0L, 0.0, 0j)
# - üres sorozatok (pl. '', (), [])
# - üres konténerek (pl., {}, set())
# - egyes felhasználó által definiált osztályok példányai bizonyos szabályok szerint,
# ld: https://docs.python.org/2/reference/datamodel.html#object.__nonzero__
#
# Minden egyéb érték "truthy" (a bool() függvénynek átadva igazra értékelődnek ki)
bool(0) # => False
bool("") # => False
####################################################
# 2. Változók és kollekciók
####################################################
# Létezik egy print utasítás
print "I'm Python. Nice to meet you!" # => I'm Python. Nice to meet you!
# Így lehet egyszerűen bemenetet kérni a konzolról:
input_string_var = raw_input(
"Enter some data: ") # Visszatér a megadott stringgel
input_var = input("Enter some data: ") # Kiértékeli a bemenetet python kódként
# Vigyázat: a fentiek miatt az input() metódust körültekintően kell használni
# Megjegyzés: Python 3-ban az input() már deprecated, és a raw_input() lett input()-ra átnevezve
# A változókat nem szükséges a használat előtt deklarálni
some_var = 5 # Konvenció szerint a névben kisbetu_es_alulvonas
some_var # => 5
# Érték nélküli változóra hivatkozás hibát dob.
# Lásd a Control Flow szekciót a kivételkezelésről.
some_other_var # name error hibát dob
# az if használható kifejezésként
# a C nyelv '?:' ternáris operátorával egyenértékűen
"yahoo!" if 3 > 2 else 2 # => "yahoo!"
# A listákban sorozatok tárolhatóak
li = []
# Már inicializáláskor megadhatóak elemek
other_li = [4, 5, 6]
# A lista végére az append metódus rak új elemet
li.append(1) # li jelenleg [1]
li.append(2) # li jelenleg [1, 2]
li.append(4) # li jelenleg [1, 2, 4]
li.append(3) # li jelenleg [1, 2, 4, 3]
# A végéről a pop metódus távolít el elemet
li.pop() # => 3 és li jelenleg [1, 2, 4]
# Rakjuk vissza
li.append(3) # li jelenleg [1, 2, 4, 3], újra.
# A lista elemeket tömb indexeléssel lehet hivatkozni
li[0] # => 1
# A már inicializált értékekhez a = jellel lehet új értéket rendelni
li[0] = 42
li[0] # => 42
li[0] = 1 # csak visszaállítjuk az eredeti értékére
# Így is lehet az utolsó elemre hivatkozni
li[-1] # => 3
# A túlindexelés eredménye IndexError
li[4] # IndexError hibát dob
# A lista részeit a slice szintaxissal lehet kimetszeni
# (Matekosoknak ez egy zárt/nyitott intervallum.)
li[1:3] # => [2, 4]
# A lista eleje kihagyható így
li[2:] # => [4, 3]
# Kihagyható a vége
li[:3] # => [1, 2, 4]
# Minden második elem kiválasztása
li[::2] # =>[1, 4]
# A lista egy másolata, fordított sorrendben
li[::-1] # => [3, 4, 2, 1]
# A fentiek kombinációival bonyolultabb slice parancsok is képezhetőek
# li[start:end:step]
# Listaelemek a "del" paranccsal törölhetőek
del li[2] # li jelenleg [1, 2, 3]
# A listák összeadhatóak
li + other_li # => [1, 2, 3, 4, 5, 6]
# Megjegyzés: az eredeti li és other_li értékei változatlanok
# Összefőzhetőek (konkatenálhatóak) az "extend()" paranccsal
li.extend(other_li) # li jelenleg [1, 2, 3, 4, 5, 6]
# Egy elem első előfordulásának eltávolítása
li.remove(2) # li jelenleg [1, 3, 4, 5, 6]
li.remove(2) # ValueError hibát dob, mivel a 2 nem szerepel már a listában
# Elemek beszúrhatóak tetszőleges helyre
li.insert(1, 2) # li jelenleg [1, 2, 3, 4, 5, 6], ismét
# Egy elem első előfordulási helye
li.index(2) # => 1
li.index(7) # ValueError hibát dob, mivel a 7 nem szerepel a listában
# Egy listában egy elem előfordulása az "in" szóval ellenőrizhető
1 in li # => True
# A lista hossza a "len()" függvénnyel
len(li) # => 6
# Az N-esek ("tuple") hasonlítanak a listákhoz, de nem módosíthatóak
tup = (1, 2, 3)
tup[0] # => 1
tup[0] = 3 # TypeError hibát dob
# Az összes lista-műveletet ezeken is használható
len(tup) # => 3
tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6)
tup[:2] # => (1, 2)
2 in tup # => True
# Az N-esek (és listák) kicsomagolhatóak külön változókba
a, b, c = (1, 2, 3) # az a így 1, a b 2 és a c pedig 3
d, e, f = 4, 5, 6 # a zárójel elhagyható
# Ha elhagyod a zárójeleket, alapértelmezés szerint tuple képződik
g = 4, 5, 6 # => (4, 5, 6)
# Nézd, milyen egyszerű két értéket megcserélni
e, d = d, e # d most már 5 és az e 4
# A Dictionary típusokban hozzárendelések (kulcs-érték párok) tárolhatók
empty_dict = {}
# Ez pedig rögtön értékekkel van inicializálva
filled_dict = {"one": 1, "two": 2, "three": 3}
# Egy dictionary értékei [] jelek közt indexelhetőek
filled_dict["one"] # => 1
# A "keys()" metódus visszatér a kulcsok listájával
filled_dict.keys() # => ["three", "two", "one"]
# Megjegyzés: egy dictionary párjainak sorrendje nem garantált
# Lehet, hogy már a fenti példán is más sorrendben kaptad meg az elemeket.
# Az értékek listája a "values()" metódussal kérhető le
filled_dict.values() # => [3, 2, 1]
# ld. a fenti megjegyzést az elemek sorrendjéről.
# Az összes kulcs-érték pár megkapható N-esek listájaként az "items()" metódussal
filled_dict.items() # => [("one", 1), ("two", 2), ("three", 3)]
# Az "in" kulcssszóval ellenőrizhető, hogy egy kulcs szerepel-e a dictionary-ben
"one" in filled_dict # => True
1 in filled_dict # => False
# Nem létező kulcs hivatkozása KeyError hibát dob
filled_dict["four"] # KeyError
# A "get()" metódus használatával elkerülhető a KeyError
filled_dict.get("one") # => 1
filled_dict.get("four") # => None
# A metódusnak megadható egy alapértelmezett visszatérési érték is, hiányzó értékek esetén
filled_dict.get("one", 4) # => 1
filled_dict.get("four", 4) # => 4
# Megjegyzés: ettől még filled_dict.get("four") => None
# (vagyis a get nem állítja be az alapértelmezett értéket a dictionary-ben)
# A kulcsokhoz értékek a listákhoz hasonló szintaxissal rendelhetőek:
filled_dict["four"] = 4 # ez után filled_dict["four"] => 4
# A "setdefault()" metódus csak akkor állít be egy értéket, ha az adott kulcshoz még nem volt más megadva
filled_dict.setdefault("five", 5) # filled_dict["five"] beállítva 5-re
filled_dict.setdefault("five", 6) # filled_dict["five"] még mindig 5
# Egy halmaz ("set") olyan, mint egy lista, de egy elemet csak egyszer tárolhat
empty_set = set()
# Inicializáljuk ezt a halmazt néhány elemmel
some_set = set([1, 2, 2, 3, 4]) # some_set jelenleg set([1, 2, 3, 4])
# A sorrend itt sem garantált, még ha néha rendezettnek is tűnhet
another_set = set([4, 3, 2, 2, 1]) # another_set jelenleg set([1, 2, 3, 4])
# Python 2.7 óta már {} jelek közt is lehet halmazt definiálni
filled_set = {1, 2, 2, 3, 4} # => {1, 2, 3, 4}
# Új halmaz-elemek hozzáadása
filled_set.add(5) # filled_set is now {1, 2, 3, 4, 5}
# Halmaz metszés a & operátorral
other_set = {3, 4, 5, 6}
filled_set & other_set # => {3, 4, 5}
# Halmaz unió | operátorral
filled_set | other_set # => {1, 2, 3, 4, 5, 6}
# Halmaz különbség -
{1, 2, 3, 4} - {2, 3, 5} # => {1, 4}
# Szimmetrikus differencia ^
{1, 2, 3, 4} ^ {2, 3, 5} # => {1, 4, 5}
# Vizsgáljuk, hogy a bal oldali halmaz magában foglalja-e a jobb oldalit
{1, 2} >= {1, 2, 3} # => False
# Vizsgáljuk, hogy a bal oldali halmaz részhalmaza-e a jobb oldalinak
{1, 2} <= {1, 2, 3} # => True
# Halmazbeli elemek jelenléte az in kulcssszóval vizsgálható
2 in filled_set # => True
10 in filled_set # => False
####################################################
# 3. Control Flow
####################################################
# Legyen egy változónk
some_var = 5
# Ez egy if elágazás. A behúzás mértéke (az indentáció) jelentéssel bír a nyelvben!
# Ez a kód ezt fogja kiírni: "some_var kisebb 10-nél"
if some_var > 10:
print "some_var nagyobb, mint 10."
elif some_var < 10: # Az elif kifejezés nem kötelező az if szerkezetben.
print "some_var kisebb 10-nél"
else: # Ez sem kötelező.
print "some_var kereken 10."
"""
For ciklusokkal végigiterálhatunk listákon
a kimenet:
A(z) kutya emlős
A(z) macska emlős
A(z) egér emlős
"""
for animal in ["kutya", "macska", "egér"]:
# A {0} kifejezéssel formázzuk a stringet, ld. korábban.
print "A(z) {0} emlős".format(animal)
"""
"range(number)" visszatér számok listájával 0-től number-ig
a kimenet:
0
1
2
3
"""
for i in range(4):
print i
"""
"range(lower, upper)" visszatér a lower és upper közti számok listájával
a kimenet:
4
5
6
7
"""
for i in range(4, 8):
print i
"""
A while ciklus a feltétel hamissá válásáig fut.
a kimenet:
0
1
2
3
"""
x = 0
while x < 4:
print x
x += 1 # Rövidítés az x = x + 1 kifejezésre
# A kivételek try/except blokkokkal kezelhetőek
# Python 2.6-tól felfele:
try:
# A "raise" szóval lehet hibát dobni
raise IndexError("Ez egy index error")
except IndexError as e:
pass # A pass egy üres helytartó művelet. Itt hívnánk a hibakezelő kódunkat.
except (TypeError, NameError):
pass # Ha szükséges, egyszerre több hiba típus is kezelhető
else: # Az except blokk után opcionálisan megadható
print "Minden rendben!" # Csak akkor fut le, ha fentebb nem voltak hibák
finally: # Mindenképpen lefut
print "Itt felszabadíthatjuk az erőforrásokat például"
# Az erőforrások felszabadításához try/finally helyett a with használható
with open("myfile.txt") as f:
for line in f:
print line
####################################################
# 4. Függvények
####################################################
# A "def" szóval hozhatunk létre új függvényt
def add(x, y):
print "x is {0} and y is {1}".format(x, y)
return x + y # A return szóval tudunk értékeket visszaadni
# Így hívunk függvényt paraméterekkel
add(5, 6) # => a konzol kimenet "x is 5 and y is 6", a visszatérési érték 11
# Nevesített paraméterekkel (ún. "keyword arguments") is hívhatunk egy függvényt
add(y=6, x=5) # Ez esetben a sorrendjük nem számít
# Változó számú paramétert fogadó függvény így definiálható.
# A * használatával a paramétereket egy N-esként kapjuk meg.
def varargs(*args):
return args
varargs(1, 2, 3) # => (1, 2, 3)
# Változó számú nevesített paramétert fogadó függvény is megadható,
# a ** használatával a paramétereket egy dictionary-ként kapjuk meg
def keyword_args(**kwargs):
return kwargs
# Nézzük meg, mi történik
keyword_args(big="foot", loch="ness") # => {"big": "foot", "loch": "ness"}
# A két módszer egyszerre is használható
def all_the_args(*args, **kwargs):
print args
print kwargs
"""
all_the_args(1, 2, a=3, b=4) kimenete:
(1, 2)
{"a": 3, "b": 4}
"""
# Függvények hívásakor a fenti args és kwargs módszerek inverze használható
# A * karakter kifejt egy listát külön paraméterekbe, a ** egy dictionary-t nevesített paraméterekbe.
args = (1, 2, 3, 4)
kwargs = {"a": 3, "b": 4}
all_the_args(*args) # egyenértékű: foo(1, 2, 3, 4)
all_the_args(**kwargs) # egyenértékű: foo(a=3, b=4)
all_the_args(*args, **kwargs) # egyenértékű: foo(1, 2, 3, 4, a=3, b=4)
# A fenti arg és kwarg paraméterek továbbadhatóak egyéb függvényeknek,
# a * illetve ** operátorokkal kifejtve
def pass_all_the_args(*args, **kwargs):
all_the_args(*args, **kwargs)
print varargs(*args)
print keyword_args(**kwargs)
# Függvény scope
x = 5
def set_x(num):
# A lokális x változó nem ugyanaz, mint a globális x
x = num # => 43
print x # => 43
def set_global_x(num):
global x
print x # => 5
x = num # a globális x-et 6-ra állítjuk
print x # => 6
set_x(43)
set_global_x(6)
# A pythonban a függvény elsőrendű (ún. "first class") típus
def create_adder(x):
def adder(y):
return x + y
return adder
add_10 = create_adder(10)
add_10(3) # => 13
# Névtelen függvények is definiálhatóak
(lambda x: x > 2)(3) # => True
(lambda x, y: x ** 2 + y ** 2)(2, 1) # => 5
# Léteznek beépített magasabb rendű függvények
map(add_10, [1, 2, 3]) # => [11, 12, 13]
map(max, [1, 2, 3], [4, 2, 1]) # => [4, 2, 3]
filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7]
# A listaképző kifejezések ("list comprehensions") jól használhatóak a map és filter függvényekkel
[add_10(i) for i in [1, 2, 3]] # => [11, 12, 13]
[x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7]
# halmaz és dictionary képzők is léteznek
{x for x in 'abcddeef' if x in 'abc'} # => {'a', 'b', 'c'}
{x: x ** 2 for x in range(5)} # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
####################################################
# 5. Osztályok
####################################################
# Az object osztály egy alosztályát képezzük
class Human(object):
# Osztály szintű mező: az osztály összes példányában azonos
species = "H. sapiens"
# Ez a függvény meghívódik az osztály példányosításakor.
# Megjegyzés: a dupla aláhúzás a név előtt és után egy konvenció a python
# előre definiált, a nyelv által belsőleg használt, de a felhasználó által
# is látható objektumok és mezők neveire.
# Ne vezessünk be új, ilyen elnevezési sémát használó neveket!
def __init__(self, name):
# A paramétert értékül adjuk a példány name attribútumának
self.name = name
# Inicializálunk egy mezőt
self.age = 0
# Példány metódus. Minden metódus első paramétere a "self", a példány maga
def say(self, msg):
return "{0}: {1}".format(self.name, msg)
# Egy osztálymetódus az osztály összes példány közt meg van osztva.
# Hívásukkor az első paraméter mindig a hívó osztály.
@classmethod
def get_species(cls):
return cls.species
# Egy statikus metódus osztály és példányreferencia nélkül hívódik
@staticmethod
def grunt():
return "*grunt*"
# Egy property jelölésű függvény olyan, mint egy getter.
# Használatával az age mező egy csak-olvasható attribútummá válik.
@property
def age(self):
return self._age
# Így lehet settert megadni egy mezőhöz
@age.setter
def age(self, age):
self._age = age
# Így lehet egy mező törlését engedélyezni
@age.deleter
def age(self):
del self._age
# Példányosítsuk az osztályt
i = Human(name="Ian")
print i.say("hi") # kimenet: "Ian: hi"
j = Human("Joel")
print j.say("hello") # kimenet: "Joel: hello"
# Hívjuk az osztály metódusunkat
i.get_species() # => "H. sapiens"
# Változtassuk meg az osztály szintű attribútumot
Human.species = "H. neanderthalensis"
i.get_species() # => "H. neanderthalensis"
j.get_species() # => "H. neanderthalensis"
# Hívjuk meg a statikus metódust
Human.grunt() # => "*grunt*"
# Adjunk új értéket a mezőnek
i.age = 42
# Kérjük le a mező értékét
i.age # => 42
# Töröljük a mezőt
del i.age
i.age # => AttributeError hibát dob
####################################################
# 6. Modulok
####################################################
# Modulokat így lehet importálni
import math
print math.sqrt(16) # => 4.0
# Lehetséges csak bizonyos függvényeket importálni egy modulból
from math import ceil, floor
print ceil(3.7) # => 4.0
print floor(3.7) # => 3.0
# Egy modul összes függvénye is importálható
# Vigyázat: ez nem ajánlott.
from math import *
# A modulok nevei lerövidíthetőek
import math as m
math.sqrt(16) == m.sqrt(16) # => True
# Meggyőződhetünk róla, hogy a függvények valóban azonosak
from math import sqrt
math.sqrt == m.sqrt == sqrt # => True
# A Python modulok egyszerű fájlok.
# Írhatsz sajátot és importálhatod is.
# A modul neve azonos a tartalmazó fájl nevével.
# Így lehet megtekinteni, milyen mezőket és függvényeket definiál egy modul.
import math
dir(math)
# Ha van egy math.py nevű Python scripted a jelenleg futó scripttel azonos
# mappában, a math.py fájl lesz betöltve a beépített Python modul helyett.
# A lokális mappa prioritást élvez a beépített könyvtárak felett.
####################################################
# 7. Haladóknak
####################################################
# Generátorok
# Egy generátor értékeket "generál" amikor kérik, a helyett, hogy előre eltárolná őket.
# A következő metódus (ez még NEM egy generátor) megduplázza a kapott iterable elemeit,
# és eltárolja őket. Nagy méretű iterable esetén ez nagyon sok helyet foglalhat!
def double_numbers(iterable):
double_arr = []
for i in iterable:
double_arr.append(i + i)
return double_arr
# A következő kód futtatásakor az összes szám kétszeresét kiszámítanánk, és visszaadnánk
# ezt a nagy listát a ciklus vezérléséhez.
for value in double_numbers(range(1000000)): # `test_non_generator`
print value
if value > 5:
break
# Használjunk inkább egy generátort, ami "legenerálja" a soron következő elemet,
# amikor azt kérik tőle
def double_numbers_generator(iterable):
for i in iterable:
yield i + i
# A lenti kód mindig csak a soron következő számot generálja a logikai vizsgálat előtt.
# Így amikor az érték eléri a > 5 határt, megszakítjuk a ciklust, és a lista számainak
# nagy részénél megspóroltuk a duplázás műveletet (ez sokkal gyorsabb így!).
for value in double_numbers_generator(xrange(1000000)): # `test_generator`
print value
if value > 5:
break
# Feltűnt, hogy a `test_non_generator` esetén `range`, a `test_generator` esetén
# pedig `xrange` volt a segédfüggvény neve? Ahogy `double_numbers_generator` a
# generátor változata a `double_numbers` függvénynek, úgy az `xrange` a `range`
# generátor megfelelője, csak akkor generálja le a következő számot, amikor kérjük
# - esetünkben a ciklus következő iterációjakor
# A lista képzéshez hasonlóan generátor képzőket is használhatunk
# ("generator comprehensions").
values = (-x for x in [1, 2, 3, 4, 5])
for x in values:
print(x) # kimenet: -1 -2 -3 -4 -5
# Egy generátor összes generált elemét listaként is elkérhetjük:
values = (-x for x in [1, 2, 3, 4, 5])
gen_to_list = list(values)
print(gen_to_list) # => [-1, -2, -3, -4, -5]
# Dekorátorok
# A dekorátor egy magasabb rendű függvény, aminek bemenete és kimenete is egy függvény.
# A lenti egyszerű példában az add_apples dekorátor a dekorált get_fruits függvény
# kimenetébe beszúrja az 'Apple' elemet.
def add_apples(func):
def get_fruits():
fruits = func()
fruits.append('Apple')
return fruits
return get_fruits
@add_apples
def get_fruits():
return ['Banana', 'Mango', 'Orange']
# A kimenet tartalmazza az 'Apple' elemet:
# Banana, Mango, Orange, Apple
print ', '.join(get_fruits())
# Ebben a példában a beg dekorátorral látjuk el a say függvényt.
# Beg meghívja say-t. Ha a say_please paraméter igaz, akkor
# megváltoztatja az eredmény mondatot.
from functools import wraps
def beg(target_function):
@wraps(target_function)
def wrapper(*args, **kwargs):
msg, say_please = target_function(*args, **kwargs)
if say_please:
return "{} {}".format(msg, "Please! I am poor :(")
return msg
return wrapper
@beg
def say(say_please=False):
msg = "Can you buy me a beer?"
return msg, say_please
print say() # Can you buy me a beer?
print say(say_please=True) # Can you buy me a beer? Please! I am poor :(
```
## Még több érdekel?
### Ingyenes online tartalmak
* [Automate the Boring Stuff with Python](https://automatetheboringstuff.com)
* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)
* [Dive Into Python](http://www.diveintopython.net/)
* [The Official Docs](http://docs.python.org/2/)
* [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/)
* [Python Module of the Week](http://pymotw.com/2/)
* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182)
* [First Steps With Python](https://realpython.com/learn/python-first-steps/)
* [LearnPython](http://www.learnpython.org/)
* [Fullstack Python](https://www.fullstackpython.com/)
### Könyvek
* [Programming Python](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20)
* [Dive Into Python](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20)
* [Python Essential Reference](http://www.amazon.com/gp/product/0672329786/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0672329786&linkCode=as2&tag=homebits04-20)

554
hu/ruby.md Normal file
View File

@@ -0,0 +1,554 @@
---
language: Ruby
lang: hu-hu
filename: learnruby-hu.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
- [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)

172
hu/typescript.md Normal file
View File

@@ -0,0 +1,172 @@
---
language: TypeScript
contributors:
- ["Philippe Vlérick", "https://github.com/pvlerick"]
translators:
- ["Tamás Diószegi", "https://github.com/ditam"]
filename: learntypescript-hu.ts
lang: hu-hu
---
A TypeScript nyelv a JavaScript nyelven írt nagy méretű alkalmazások fejlesztését kívánja megkönnyíteni.
A TypeScript olyan, más nyelvekből ismert gyakori fogalmakat ad hozzá a JavaScripthez, mint például osztályok, interfészek, generikusság, és (opcionális) statikus típusosság.
A JavaScript egy befoglaló halmazát képzi: minden JavaScript kód érvényes TypeScript kód, így könnyen hozzáadható meglévő projektekhez. A TypeScript fordító kimenetként JavaScript kódot állít elő.
Ez a dokumentum a TypeScript által hozzáadott új szintaxissal foglalkozik, nem pedig a [JavaScripttel](../javascript/).
Hogy kipróbáld a TypeScript fordítót, látogass el a [Játszótérre avagy Playground-ra](https://www.typescriptlang.org/Playground) ahol kódot írhatsz automatikus kódkiegészítéssel, és közvetlenül láthatod az előállított JavaScript kódot.
```ts
// 3 alapvető típus létezik TypeScriptben
var isDone: boolean = false;
var lines: number = 42;
var name: string = "Anders";
// Amikor nem lehet a típust előre tudni, használható az "Any" típus
var notSure: any = 4;
notSure = "talán mégis sztring lesz";
notSure = false; // tévedtem, mégis boolean
// Kollekciókból létezik típusos és generikus tömb
var list: number[] = [1, 2, 3];
// ugyanez a generikus típus használatával
var list: Array<number> = [1, 2, 3];
// Enumerált típusok:
enum Color {Red, Green, Blue};
var c: Color = Color.Green;
// Végül, "void" használható a visszatérési értékkel nem bíró függvényeknél
function bigHorribleAlert(): void {
alert("Kis idegesítő doboz vagyok!");
}
// A függvények elsőrangú (first-class) típusok, használható a vastag nyilas
// lambda szintaxis,
// a compiler pedig kikövetkezteti a típusokat (inferred types)
// A következők egyenértékűek, ugyanaz a szignatúra kerül kikövetkeztetésre, és
// így ugyanaz a JavaScript kód lesz előállítva
var f1 = function(i: number): number { return i * i; }
// Következtetett visszatérési értékkel
var f2 = function(i: number) { return i * i; }
var f3 = (i: number): number => { return i * i; }
// Következtetett visszatérési értékkel
var f4 = (i: number) => { return i * i; }
// Következtetett visszatérési értékkel,
// ebben az egysoros formában nem szükséges a return kulcsszó
var f5 = (i: number) => i * i;
// Az interfészek szerkezeti alapon működnek, vagyis minden objektum, ahol
// jelen vannak a megfelelő mezők kompatibilis az interfésszel
interface Person {
name: string;
// Az opcionális tagokat "?" jelöli
age?: number;
// És persze függvények is:
move(): void;
}
// Egy objektum, ami megvalósítja a "Person" interfészt
// Tekinthető Personnek, hiszen van name és move mezője
var p: Person = { name: "Bobby", move: () => {} };
// Egy objektum, ahol az opcionális mező is jelen van:
var validPerson: Person = { name: "Bobby", age: 42, move: () => {} };
// Ez viszont nem Person, mert az age mező típusa nem szám!
var invalidPerson: Person = { name: "Bobby", age: true };
// Az interfészekkel függvény típusok is leírhatóak:
interface SearchFunc {
(source: string, subString: string): boolean;
}
// Csak a paraméterek típusai számítanak, a neveik nem.
var mySearch: SearchFunc;
mySearch = function(src: string, sub: string) {
return src.search(sub) != -1;
}
// Osztályok - a mezők alapértelmezésben publikusak
class Point {
// Mezők
x: number;
// Konstruktor - a public/private kulcsszavak ebben a kontextusban
// legenerálják a mezőkhöz szükséges kódot a konstruktorban.
// Ebben a példában az "y" ugyanúgy definiálva lesz, mint az "x", csak
// kevesebb kóddal.
// Alapértelmezett (default) értékek is megadhatóak.
constructor(x: number, public y: number = 0) {
this.x = x;
}
// Metódusok
dist() { return Math.sqrt(this.x * this.x + this.y * this.y); }
// Statikus mezők
static origin = new Point(0, 0);
}
var p1 = new Point(10 ,20);
var p2 = new Point(25); //y itt 0 lesz
// Öröklés
class Point3D extends Point {
constructor(x: number, y: number, public z: number = 0) {
super(x, y); // Szükséges az ősosztály konstruktorának explicit hívása
}
// Felülírás
dist() {
var d = super.dist();
return Math.sqrt(d * d + this.z * this.z);
}
}
// Modulok
// ("." használható az almodulok számára)
module Geometry {
export class Square {
constructor(public sideLength: number = 0) {
}
area() {
return Math.pow(this.sideLength, 2);
}
}
}
var s1 = new Geometry.Square(5);
// Új lokális név definiálása a module számára
import G = Geometry;
var s2 = new G.Square(10);
// Generikus típusok
// Osztályok
class Tuple<T1, T2> {
constructor(public item1: T1, public item2: T2) {
}
}
// Interfészek
interface Pair<T> {
item1: T;
item2: T;
}
// és függvények
var pairToTuple = function<T>(p: Pair<T>) {
return new Tuple(p.item1, p.item2);
};
var tuple = pairToTuple({ item1:"hello", item2:"world"});
// definíciós fájl hivatkozása:
/// <reference path="jquery.d.ts" />
```
## További források
* [TypeScript hivatalos weboldala](https://www.typescriptlang.org/)
* [Forráskód GitHubon](https://github.com/microsoft/TypeScript)

147
hu/yaml.md Normal file
View File

@@ -0,0 +1,147 @@
---
language: YAML
filename: learnyaml-hu.yaml
contributors:
- ["Leigh Brenecki", "https://github.com/adambrenecki"]
translators:
- ["Tamás Diószegi", "https://github.com/ditam"]
lang: hu-hu
---
A YAML egy adat sorosító nyelv, amit úgy terveztek, hogy közvetlenül is
olvasható és írható legyen emberi szemmel.
A JSON formátum egy szigorú befoglaló halmazát alkotja, kiegészítve azt
szintaktikai jelentéssel bíró sortörésekkel és indentációval,
a Pythonhoz hasonlóan. A Pythonnal ellentétben azonban a YAML nem engedélyezi
a közvetlen tab karakterek jelenlétét.
Megjegyzés: UTF-8 ékezetes betűk használhatóak, ha a fájl kódlása megfelelő,
a kódolást a tartalomban explicit nem kell (és nem is lehet) feltüntetni.
```yaml
# A kommentek YAML-ban így néznek ki.
##################
# Skalár típusok #
##################
# A gyökér objektumunk (az egész dokumentumra értve) egy map,
# ami a más nyelvekből ismert dictionary, hash vagy object típusokkal egyenértékű.
kulcs: érték
masik_kulcs: Másik érték jön ide.
egy_szam: 100
tudomanyos_jelolessel: 1e+12
boolean: true
null_value: null
kulcs benne szóközökkel: érték
# Látható, hogy a sztringeket nem szükséges idézőjelek közé zárni, bár szabad.
Továbbá: "Idézőjelekkel megadott sztring."
"A kulcs is lehet idézőjeles.": "Hasznos lehet, ha ':'-ot akarsz a kulcsban."
# Többsoros sztringek írhatóak 'literal block'-ként ('|' jelet használva)
# vagy 'folded block'-ként is ('>' jelet használva).
literal_block: |
Ez az egész szöveg-blokk lesz az értéke a literal_block kulcsnak,
a sortöréseket megtartva.
Az ilyen sztringet az indentáció visszahúzása zárja le, a behúzás pedig
eltávolításra kerül.
A 'még jobban' behúzott részek megtartják a behúzásukat -
ezeknek a soroknak 4 szóköz behúzása lesz.
folded_style: >
Az az egész szöveg-blokk lesz az értéke a 'folded_style' kulcsnak, de
ezúttal minden sortörés egy szóközre lesz cserélve.
Az üres sorok, mint a fenti, új sor karakterre cserélődnek.
A 'még jobban' behúzott sorok megtartják a sortöréseiket, -
ez a szöveg két sorban jelenik meg.
######################
# Gyűjtemény típusok #
######################
# Egymásba ágyazás a behúzás változtatásával érhető el.
beagyazott_map:
key: value
another_key: Another Value
masik_beagyazott_map:
hello: hello
# A mapeknek nem csak sztring kulcsaik lehetnek.
0.25: lebegőpontos kulcs
# A kulcsok lehetnek többsoros objektumok is, ? jellel jelezve a kulcs kezdetét
? |
Ez itt egy
többsoros kulcs
: és ez az értéke
# Szintén engedélyezett a kollekció típusok használata kulcsként, de egyéb
# nyelvekben ez gyakran problémákat fog okozni.
# Szekvenciák (listákkal vagy tömbökkel egyenértékűek) így néznek ki:
egy_szekvencia:
- Item 1
- Item 2
- 0.5 # Többféle típust is tartalmazhat
- Item 4
- key: value
another_key: another_value
-
- Ez egy szekvencia
- egy másik szekvenciába ágyazva
# Mivel a YAML a JSON befoglaló halmazát alkotja, JSON szintaxisú
# mapek és szekvenciák is használhatóak:
json_map: {"key": "value"}
json_seq: [3, 2, 1, "takeoff"]
#########################
# EXTRA YAML KÉPESSÉGEK #
#########################
# A YAML-ben ún. 'anchor'-ök segítségével könnyen lehet duplikálni
# tartalmakat a dokumentumon belül. A következő kulcsok azonos értékkel bírnak:
anchored_tartalom: &anchor_neve Ez a sztring két kulcs értéke is lesz.
másik_anchor: *anchor_neve
# Vannak a YAML-ben tagek is, amivel explicit lehet típusokat jelölni.
explicit_string: !!str 0.5
# Bizonyos implementációk nyelv-specifikus tageket tartalmaznak, mint
# például ez a Python komplex szám típusának jelölésére:
python_complex_number: !!python/complex 1+2j
######################
# EXTRA YAML TÍPUSOK #
######################
# Nem a sztringek és a számok az egyedüli skalár típusok YAML-ben.
# ISO-formátumú dátumok és dátumot jelölő literal kifejezések is értelmezettek.
datetime: 2001-12-15T02:59:43.1Z
datetime_with_spaces: 2001-12-14 21:59:43.10 -5
date: 2002-12-14
# A !!binary tag jelöli, hogy egy sztring valójában base64-kódolású
# reprezentációja egy bináris blob-nak
gif_file: !!binary |
R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
+f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
# Létezik a YAML-ban egy halmaz típus (set) is, ami így néz ki:
set:
? elem1
? elem2
? elem3
# Mint Pythonban, a halmazok null értékekkel feltöltött mapek, vagyis a fenti
# halmaz egyenértékű a következővel:
set2:
elem1: null
elem2: null
elem3: null
```