Pas një vit zhvillimi lëshimi , një gjuhë programimi dinamike, objektor-orientuar, e cila shquhet për efikasitetin e saj në zhvillimin e softuerit dhe përfshin karakteristikat më të mira nga Perl, Java, Python, Smalltalk, Eiffel, Ada dhe Lisp. Kodi i projektit shpërndahet nën licencat BSD ("2-clause BSDL") dhe "Ruby", e cila referon versionin e fundit të licencës GPL dhe është plotësisht e pajtueshme me GPLv3. Ruby 2.7 është versioni i shtatë i rëndësishëm, i përgatitur në kuadër të procesit planifikues të zhvillimit, i cili parashikon një vit për përgatitjen e përmirësimeve funksionale dhe publikimin çdo 2-3 muaj të versioneve korrigjuese.
Ndryshimet kryesore :
- Eksperimentale në lidhje me modelet (), e cila lejon të kalosh një objekt të caktuar dhe të caktohesh një vlerë nëse ka një përputhje me modelin.
case [0, [1, 2, 3]]
in [a, [b, *c]]
p a #=> 0
p b #=> 1
p c #=> [2, 3]
endcase {a: 0, b: 1}
in {a: 0, x: 1}
:unreachable
in {a: 0, b: var}
p var #=> 1
end - NĂ« shell-in interaktiv tĂ« llogaritjeve irb (REPL, Read-Eval-Print-Loop) Ă«shtĂ« shtuar mundĂ«sia pĂ«r redaktim shumĂ«-rreshtor, implementuar me njĂ« bibliotekĂ« e cila Ă«shtĂ« e pajtueshme me readline , e shkruar nĂ« gjuhĂ«n Ruby. ĂshtĂ« integruar mbĂ«shtetje pĂ«r rdoc, e cila lejon shikimin e informacionit ndihmĂ«s nĂ« irb pĂ«r klasat, modulet dhe metodat e caktuara. JanĂ« siguruar ngjyrosje tĂ« kodit me ngjyra pĂ«r rreshtat e kodit qĂ« shfaqen pĂ«rmes Binding#irb dhe rezultatet e inspektimit tĂ« objekteve tĂ« klasave bazĂ«.
- ĂshtĂ« shtuar njĂ« grumbullues i ngjeshjes (Compaction GC), i cili mund tĂ« kryejĂ« defragmimin e hapĂ«sirĂ«s sĂ« kujtesĂ«s, duke zgjidhur problemet e uljes sĂ« performancĂ«s dhe rritjes sĂ« konsumit tĂ« kujtesĂ«s pĂ«r shkak tĂ« fragmentimit tĂ« kujtesĂ«s, i cili ndodh gjatĂ« funksionimit tĂ« disa aplikacioneve Ruby me shumĂ« threads. PĂ«r paketimin e objekteve nĂ« grumbull metoda GC.compact, e cila lejon tĂ« reduktohet numri i faqeve tĂ« pĂ«rdorura tĂ« kujtesĂ«s dhe tĂ« optimizohet heap pĂ«r operacionet
CoW (copy-on-write). - përgatitja për ndarjen e argumenteve, të përcaktuar në bazë të pozicionit në listë ("def foo(a,b,c)") dhe fjalëve kyçe ("def foo(key: val)"). Automatikisht të transformuara argumentet në bazë të fjalëve kyçe dhe pozicionit janë shpallur të vjetra dhe nuk do të mbështeten në degën Ruby 3.0. Në veçanti, është shpallur e vjetruar përdorimi i argumentit të fundit si parametra për fjalët kyçe, kalimi i argumenteve në bazë të fjalëve kyçe si argumenti i fundit i hash-it dhe ndarja e argumentit të fundit në parametrat pozicionalë dhe të fjalëve kyçe.
def foo(key: 42); end; foo({key: 42}) # warned
def foo(**kw); end; foo({key: 42}) # warned
def foo(key: 42); end; foo(**{key: 42}) # OK
def foo(**kw); end; foo(**{key: 42}) # OKdef foo(h, **kw); end; foo(key: 42) # warned
def foo(h, key: 42); end; foo(key: 42) # warned
def foo(h, **kw); end; foo({key: 42}) # OK
def foo(h, key: 42); end; foo({key: 42}) # OKdef foo(h={}, key: 42); end; foo(«key» => 43, key: 42) # warned
def foo(h={}, key: 42); end; foo({«key» => 43, key: 42}) # warned
def foo(h={}, key: 42); end; foo({«key» => 43}, key: 42) # OKdef foo(opt={}): end; foo(key: 42) # OK
def foo(h, **nil); end; foo(key: 1) # ArgumentError
def foo(h, **nil); end; foo(**{key: 1}) # ArgumentError
def foo(h, **nil); end; foo(«str» => 1) # ArgumentError
def foo(h, **nil); end; foo({key: 1}) # OK
def foo(h, **nil); end; foo({«str» => 1}) # OKh = {}; def foo(*a) a end; foo(**h) # []
h = {}; def foo(a) a end; foo(**h) # {} dhe paralajmërim
h = {}; def foo(*a) a end; foo(h) # [{}]
h = {}; def foo(a) a end; foo(h) # {} - përdorimi i emrave të numëruar të variablave për parametër blokun.
[1, 2, 3].each { puts @1 } # si analogji [1, 2, 3].each { |i| puts i }
- Mbështetje eksperimentale për intervalet pa vlerë fillestare.
ary[..3] # e njëjtë me ary[0..3]
rel.where(sales: ..100) - Metoda e shtuar Enumerable#tally, e cila llogarit sa herë shfaqet çdo element.
[«a», «b», «c», «b»].tally
#=> {«a»=>1, «b»=>2, «c»=>1} - Lejohet thirrja e metodës private me literalin «self»
def foo
end
private :foo
self.foo - Metoda e shtuar Enumerator::Lazy#eager për të gjeneruar një enumerim të zakonshëm nga një enumerim "lenj" (Enumerator::Lazy).
a = %w(foo bar baz)
e = a.lazy.map {|x| x.upcase }.map {|x| x + «!» }.eager
p e.class #=> Enumerator
p e.map {|x| x + «?» } #=> [«FOO!?», «BAR!?», «BAZ!?»] - Vazhdon zhvillimi i JIT-kompiluese eksperimentale, e cila lejon tĂ« rritet ndjeshĂ«m performanca e aplikacioneve nĂ« gjuhĂ«n Ruby. JIT-kompiluese e propozuar nĂ« Ruby nĂ« fillim regjistron kodin nĂ« gjuhĂ«n C nĂ« disk, pastaj thĂ«rret njĂ« kompilator tĂ« jashtĂ«m tĂ« C pĂ«r tĂ« gjeneruar instruksionet makine (mbĂ«shtetet thirrja e GCC, Clang dhe Microsoft VC++). NĂ« versionin e ri Ă«shtĂ« implementuar njĂ« metodĂ« pĂ«r shpĂ«rndarjen inline sipas nevojĂ«s, Ă«shtĂ« siguruar pĂ«rdorimi selektiv i modeleve tĂ« optimizimit gjatĂ« kompilimit, vlera e paracaktuar "âjit-min-calls" Ă«shtĂ« rritur nga 5 nĂ« 10000, dhe "âjit-max-cache" nga 1000 nĂ« 100.
- Rritur performanca e CGI.escapeHTML, Monitor dhe MonitorMixin.
- Në Module#name, true.to_s, false.to_s dhe nil.to_s është siguruar kthimi i një stringu, i pandryshuar për objektin e specifikuar.
- Eshte reduktuar madhësia e skedave binarë që gjenerohen nga metoda RubyVM::InstructionSequence#to_binary;
- Versionet e përbërësve të integruar janë përditësuar, duke përfshirë
Bundler 2.1.2, RubyGems 3.1.2,
Racc 1.4.15,
CSV 3.1.2, REXML 3.2.3,
RSS 0.2.8,
StringScanner 1.0.3; - Disa biblioteka janë zhvendosur nga shpërndarja bazë në paketat e jashtme gem
CMath (cmath gem),
Scanf (scanf gem),
Shell (shell gem),
Synchronizer (sync gem),
ThreadsWait (thwait gem),
E2MM (e2mmap gem). - Në rubygems.org janë publikuar modulet e standardeve të ofruara si parazgjedhje:
benchmark,
cgi,
delegate,
getoptlong,
net-pop,
net-smtp,
open3,
pstore,
singleton. Modulet që nuk janë transferuar në rubygems.org janë monitor,
observer,
timeout,
tracer,
uri,
yaml, të cilat ofrohen vetëm në ruby-core. - Tani për ndërtimin e Ruby nevojitet një kompajler C që mbështet standardin C99.
Burimi: opennet.ru
