Ruby ja Python on kaks suurepärast programmeerimiskeelt tõlgenduse ja dünaamilise tüpiseerimise mõttes. Nende rakenduste, populaarsuse ja kogukonna kohta saate lugeda ühest selle blogi sissekandest. Neil keeltel on palju ühist, kuid ka palju erinevusi. Selles artiklis tutvustan mõningaid neist.
Sarnasused
Kuna need keeled võib lisada samasse dünaamiliselt tüpiseeritud interpreteeritud keelte kategooriasse, siis ei ole kahtlust, et nad on sarnased.
Dünaamiline sisestamine
Mõlemad Python ja Ruby on dünaamiliselt tüpiseeritud keeled. Selle tulemusena ei pea programmeerija muutujate tüüpi määrama muutujate kirjutamisel kood. Nende tüüp määratakse programmi töötamise ajal ja see võib muutuda. Muutuja tüüp tuletatakse sellesse salvestatud väärtusest. Järgnev kood töötab nendes keeltes korrektselt:
muutuja = 1
variable += 2.5
variable = 'sample string'
variable = [2, 3.5, 'sample string']
Puhas süntaks
See on muu hulgas seotud eespool esitatud punktiga. Tänu sellele, et ei ole vaja deklareerida tüüpe, lõpetada avaldised semikooloniga, ja ka sellele, et tegemist on skriptikeelega, on nii kirjutamine kui ka lugemine lihtne. Hästi kirjutatud kood on loetav ka inimestele, kes ei ole nende keeltega varem kokku puutunud.
Neil on interaktiivsed konsoolitõlgid
Kui soovite sooritada lihtsat toimingut või testida koodi, ei ole vaja luua faili ja käivitada koodi spetsiaalse käsu abil. Nii Ruby kui ka Python omavad interaktiivseid konsoolitõlkeid (REPL). Python puhul saame sellise interpretaatori käivitada käsuga python
(võipython3
), samas kui Ruby puhul võib see olla näiteks, irb:
$ irb
2.5.8 :001 > tulemus = 2 + 1
=> 3
2.5.8 :002 > tulemus += 3.5
=> 6.5
Erinevused
Kuna need on erinevad programmeerimiskeeled, muidugi peavad neil olema erinevused (ma tean, milline paljastav väide). Python ja Ruby puhul on need erinevused arvukad. Kirjeldan mõningaid minu arvates kõige olulisemaid.
Sügavused
Sügavus on Python puhul väga oluline. Kõik koodiplokid on määratletud taandamisega. Oluline on, et iga rida antud plokis oleks ühesuguse taandumisega. Vastasel juhul saame koodi käivitamisel IndentationError. Ruby kasutab teistsugust lähenemist. Siin on koodiblokk piiratud märksõnadega. Me eristame algussõna (nt.begin, if, class, def
) ja lõppsõna lõpp.
Ei ole oluline, kuidas kood on koodiplokis sissepandud.
Pärimine
Üks objektorienteeritud programmeerimise põhijoontest. Õigetes kätes võib see imet teha. Python toetab mitme baasiga pärimist:
example.py
class ClassA:
def callA(self):
print('callA')
class ClassB:
def callB(self):
print('callB')
class ClassAB(ClassA, ClassB):
pass
class_inst = ClassAB()
class_inst.callA()
class_inst.callB()
Selle tulemusena saame:
$ python3 example.py
callA
callB
Ruby toetab vaikimisi ainult ühe baasi pärimist, kasutades operaatorit <. Siiski on võimalik simuleerida mitme baasiga pärimist, kasutades mooduleid:
example.rb
klass ClassA
def calla
puts 'calla'
end
end
moodul ModuleB
def callb
puts 'callb'
end
end
class ClassAB < ClassA
include ModuleB
end
classinst = ClassAB.new
classinst.calla
classinst.call_b
Mis annab meile:
$ ruby example.rb
call_a
call_b
lisada
on vaid üks Ruby's olemasolevatest seguniversaalidest. Mixins on viis lisafunktsionaalsuse lisamiseks klassidele. Ruby's on kolm mixins'i.
Lisada
Kui me helistame lisada
klassi definitsioonis, muutub lisatud moodul selle klassi otseseks esivanemaks. See tähendab, et iga mooduli meetod muutub selle klassi meetodiks. Me võime neid klassis üle kirjutada ja kutsuda ka algset (moodulis defineeritud) meetodit kasutades super
märksõna.
example.rb
moodul ModuleA
def print_something
puts 'Teade moodulist'
end
end
klass ClassB
include ModuleA
def print_something
puts 'Teade klassilt'
super
end
end
ClassB.new.print_something
Tulemus:
$ ruby example.rb
Klassi sõnum
Teade moodulist
Esileedi
See töötab peaaegu nagu lisada
, kuid eelistatud moodul muutub klassi otseseks järeltulijaks. See tähendab, et me ei saa klassis mooduli meetodit üle kirjutada, kuid mooduli meetod võib kutsuda klassi meetodit kasutadessuper
märksõna.
example.rb
moodul ModuleA
def print_something
puts 'Teade moodulist'
super
end
end
klass ClassB
prepend ModuleA
def print_something
puts 'Teade klassilt'
end
end
ClassB.new.print_something
Tulemus:
$ ruby example.rb
Teade moodulist
Teade klassist
Laiendada
See toimib sarnaselt include'iga, kuid moodulis defineeritud meetodid muutuvad klassi meetoditeks.
Tulemus:
$ ruby example.rb Mooduli sõnum
Funktsioonid ja plokid
Python-l on funktsioonid. Ruby toetab ainult meetodeid. Mida see tähendab? Muuhulgas saab Python funktsiooni hoida muutujas ja anda selle argumendina edasi teisele funktsioonile. Ruby's ei saa me seda nii lihtsalt teha. See on seotud ka sulgudes. Antud funktsioon, millel pole Python-s argumente või mille argumendid on vaikimisi, kui kasutate selle nime ilma sulgudeta, siis tagastatakse funktsioon. Ainult sulgude lisamine viib selle täitmiseni. Ruby's saame funktsioone kutsuda ilma sulgudeta:
example.py
def inner_function():
print('Sisemine funktsioon')
def wrapper_function(function):
print('Wrapper function')
# funktsioon on muutuja, mis sisaldab funktsiooni objekti
function() # sisemine funktsioon kutsutakse siin välja.
wrapperfunction(innerfunction)
Tulemus:
$ python3 example.py
Wrapper funktsioon
Sisemine funktsioon
Rubiinis:
example.rb
def inner_function
puts 'Sisemine funktsioon'
end
def wrapper_function(function)
puts 'Wrapper function'
function
end
wrapperfunction(innerfunction) # inner_function kutsutakse siin.
Tulemus:
$ ruby example.rb
Sisemine funktsioon
Wrapper funktsioon
Loomulikult saab sellisel juhul teha Ruby's mõningaid trikke, et saavutada soovitud efekt. Esiteks saame kasutada Proc-objekti:
example.rb
def inner_function
puts 'Sisemine funktsioon'
end
def wrapper_function(function)
puts 'Wrapper function'
function.call
end
func = Proc.new { innerfunction }
wrapperfunction(func)
Tulemus:
$ ruby example.rb
Wrapper funktsioon
Sisemine funktsioon
Teine lähenemisviis on kasutada plokke:
example.rb
def inner_function
puts 'Sisemine funktsioon'
end
def wrapper_function
puts 'Wrapper function'
yield
end
wrapperfunction do
innerfunction
end
Tulemus:
$ ruby example.rb
Wrapper funktsioon
Sisemine funktsioon
Loetelu mõistmine
See on väga kasulik Python funktsioon. See seisneb nimekirja loomises teise nimekirja alusel. Oletame, et meil on selline ülesanne: antud numbrite loetelu, koostada nimekiri paaritu arvu ruutudest. Pythons kasutame loendi mõistmist:
numbrid = [1, 3, 4, 7, 8, 12, 15]
tulemus = [num*num for num in numbers if num % 2]
Eeliseks on see, et meil on mälus ainult kaks nimekirja.
Ruby's on asjad veidi teisiti. Selle ülesande lahendamiseks on mitu võimalust. Esitan neist kõige loetavama:
numbrid = [1, 3, 4, 7, 8, 12, 15]
result = []
numbers.each { |num| result << num * num if num.odd? }
Nagu näeme, saab seda teha, kuid mitte nii elegantselt kui Python-s.
Kõik klassid on muudetavad
Ruby's on kõik klassid muutuvad. Mida see tähendab? Me võime lisada või üle kirjutada kõikide klasside meetodeid, isegi sisseehitatud klasside omad. Oletame, et tahame meetodit, mis muudab iga tähe an stringis b-ks. Me saame seda teha lihtsal viisil:
example.rb
klass String
def atob!
self.gsub!(/a/, 'b')
end
end
string = 'Näidis string paljude a-tähtedega'
puts string
string.atob!
puts string
Tulemus:
$ ruby example.rb
Näide string paljude a-tähtedega
Näide string mbny b-tähtedega
Kokkuvõte
Veebiarendus on olnud dünaamiline valdkond, mis võtab pidevalt vastu ja kujundab erinevaid programmeerimiskeeled oma vajadustele. Kaks populaarset valikut selles valdkonnas on Python programmeerimiskeel ja Ruby. Mõlemad on tõestanud oma väärtust veebirakenduste ehitamine ja muud liiki tarkvara, millel kõigil on oma unikaalsed eelised ja puudused.
Python on kõrgetasemeline programmeerimiskeel austatud oma lihtsuse ja koodi loetavus, mis sageli meeldib algajatele programmeerijatele. Veebileht Python programmeerimiskeel on mitmekülgne ja seda saab kasutada mitmesuguste ülesannete täitmiseks. See üldotstarbeline programmeerimiskeel kasutatakse sageli sellistes valdkondades nagu masinõpe, suured andmed ja eelkõige, veebiarendus. Laialdane Python arendajate kogukond aitab kaasa selle raamatukogude ja raamistike rikkalikule ökosüsteemile, mis suurendab selle sobivust veebirakenduste ehitamine. Django, Flask ja Pyramid on erinevate Python veebiraamistikud võimendatud veebiarendajad üle maailma.
Teisalt, Ruby, teine kõrgetasemeline üldotstarbeline programmeerimiskeel, paistab silma oma paindlikkuse ja väljendusrikkusega. See objektorienteeritud programmeerimiskeel on paljude ettevõtete selgroog veebirakendused. Rubiini võlu seisneb tema võimekuses hõlbustada veebiarendus läbi Rails raamistik, võimas vahend veebirakenduste ehitamine kiiresti.
Ruby, kuigi vähem populaarne kui Python, võib uhkeldada aktiivse ja pühendunud Ruby kogukond mis pidevalt arendab ja hooldab raamatukogude ja tööriistade valikut, rikastades seeläbi kogemust veebiarendajad kasutades seda keelt. Kuna objektorienteeritud keel, Ruby on hinnatud oma elegantsuse ja puhta, loetava koodi poolest, mis teeb sellest sobiva valiku nii väikeste kui ka suuremahuliste projektide jaoks. veebirakendused.
Python ja Ruby, nagu objektorienteeritud programmeerimiskeeled, on palju sarnast. Nad toetavad ka funktsionaalne programmeerimine, pakkudes programmeerijatele erinevaid stiile koodimiseks. Python koodhinnatakse eelkõige selle lihtsa süntaksi eest, mis rõhutab keele rõhuasetust lihtsusele ja loetavus.
Igal keelel on oma tugevused; Python'd mitmekülgsus ja lai kogukond tugi teevad sellest suurepärase tööriista erinevate ülesannete jaoks, samas kui Ruby väljendusrikkus ja Rails raamistik muudab selle tugevaks kandidaadiks veebirakendus areng. See on ainulaadne vajaduste ja eelistuste veebiarendajad mis määrab, milline keel teenib kõige paremini nende projekt.
Valdkonnas operatsioonisüsteemid, näitavad mõlemad keeled muljetavaldavat kaasaskantavust, mis suurendab veelgi nende sobivust paljude ülesannete jaoks, mis ei piirdu ainult järgmisega veebiarendus. Seetõttu on keeruline selles duellis lõplikku "võitjat" välja kuulutada.
Kuigi Python programmeerimiskeel on laiema ulatusega ja suurem kogukond, ei tohiks Ruby võimalusi alahinnata. Nende keelte täielikuks hindamiseks tuleb neisse süveneda, mõista nende keerukust ja rakendada neid seal, kus nad kõige rohkem särama hakkavad. Olenemata sellest, kas te olete veebirakenduste loomine koos Python või Ruby, iga keel pakub töökindlat platvormi, et pakkuda kvaliteetset veebirakendused. Ruby, kuigi vähem tuntud, väärib kindlasti oma väärilist tunnustust maailmas programmeerimiskeeled.