Paglabas ng Ruby programming language 2.7.0

Pagkatapos ng isang taon ng pag-unlad nalathala pakawalan Ruby 2.7.0, isang dynamic, object-oriented na programming language na napakahusay sa pagbuo ng programa at isinasama ang pinakamahusay na mga tampok ng Perl, Java, Python, Smalltalk, Eiffel, Ada, at Lisp. Ang code ng proyekto ay ipinamahagi sa ilalim ng mga lisensya ng BSD (“2-clause BSDL”) at “Ruby”, na tumutukoy sa pinakabagong bersyon ng lisensya ng GPL at ganap na tugma sa GPLv3. Ang Ruby 2.7 ay ang ikapitong pangunahing release kasunod ng isang nakaplanong proseso ng pag-develop na tumatagal ng isang taon upang maghanda ng mga functional improvement at gumagawa ng mga maintenance release bawat 2-3 buwan.

Ang pangunahing mga pagpapabuti:

  • eksperimental sinusuportahan pagtutugma ng pattern (Pagtutugma ng pattern), na nagpapahintulot sa iyo na umulit sa isang ibinigay na bagay at magtalaga ng isang halaga kung mayroong isang tugma sa pattern.

    case [0, [1, 2, 3]] sa [a, [b, *c]] pa #=> 0
    pb # => 1
    pc # => [2, 3] dulo

    kaso {a: 0, b: 1}
    sa {a: 0, x: 1}
    :hindi maabot
    sa {a: 0, b: var}
    p var # => 1
    dulo

  • Ang shell ng mga interactive na kalkulasyon na irb (REPL, Read-Eval-Print-Loop) ay nagtatampok na ngayon ng multi-line na pag-edit, na ipinatupad gamit ang isang readline-compatible na library mag-relinenakasulat sa Ruby. Ang suporta ng rdoc ay isinama, na nagbibigay-daan sa iyong tingnan ang impormasyon ng sanggunian sa mga tinukoy na klase, module at pamamaraan sa irb. Ibinigay ang pag-highlight ng kulay ng mga linya ng code na ipinakita sa pamamagitan ng Binding#irb at ang mga resulta ng inspeksyon ng mga base class object.

    Paglabas ng Ruby programming language 2.7.0

  • Nagdagdag ng isang compact garbage collector (Compaction GC) na maaaring mag-defragment ng isang rehiyon ng memorya, nilulutas ang pagganap at mga isyu sa pagkonsumo ng memory na dulot ng memory fragmentation na nangyayari sa ilang multi-threaded na Ruby application. Upang mag-pack ng mga bagay sa heap iminungkahi GC.compact na paraan upang bawasan ang bilang ng mga memory page na ginamit at i-optimize ang heap para sa mga operasyon
    CoW (copy-on-write).

  • Isinagawa naghahanda na paghiwalayin ang mga argumento batay sa posisyon sa listahan ("def foo(a,b,c)") at mga keyword ("def foo(key: val)"). Ang awtomatikong conversion ng argumento batay sa mga keyword at posisyon ay hindi na ginagamit at hindi na susuportahan sa sangay ng Ruby 3.0. Sa partikular, hindi na ginagamit ang paggamit ng huling argumento bilang mga parameter ng keyword, upang ipasa ang mga argumentong batay sa keyword bilang huling parameter ng hash, at hatiin ang huling argumento sa positional at keyword na mga parameter.

    def foo(key: 42); wakas; foo({key: 42}) #babala
    def foo(**kw); wakas; foo({key: 42}) #babala
    def foo(key: 42); wakas; foo(**{key: 42}) # OK
    def foo(**kw); wakas; foo(**{key: 42}) # OK

    def foo(h, **kw); wakas; foo(key: 42) #babala
    def foo(h, susi: 42); wakas; foo(key: 42) # binalaan
    def foo(h, **kw); wakas; foo({key: 42}) # OK
    def foo(h, susi: 42); wakas; foo({key: 42}) # OK

    def foo(h={}, key: 42); wakas; foo("key" => 43, key: 42) #warning
    def foo(h={}, key: 42); wakas; foo({"key" => 43, key: 42}) # binalaan
    def foo(h={}, key: 42); wakas; foo({"key" => 43}, key: 42) # OK

    def foo(opt={}); wakas; foo( key: 42 ) # OK

    def foo(h, **nil); wakas; foo(key: 1) # ArgumentError
    def foo(h, **nil); wakas; foo(**{key: 1}) # ArgumentError
    def foo(h, **nil); wakas; foo("str" ​​​​ => 1) # ArgumentError
    def foo(h, **nil); wakas; foo({key: 1}) # OK
    def foo(h, **nil); wakas; foo({"str" ​​​​ => 1}) # OK

    h = {}; def foo(*a) isang dulo; foo(**h) # [] h = {}; def foo(a) isang dulo; foo(**h) # {} at babala
    h = {}; def foo(*a) isang dulo; foo(h) # [{}] h = {}; def foo(a) isang dulo; foo(h) # {}

  • Pagkakataon gamit ang mga may bilang na pangalan ng variable bilang default para sa mga parameter ng block.

    [1, 2, 3].bawat { ay naglalagay ng @1 } # katulad ng [1, 2, 3].bawat { |i| inilalagay ako }

  • Pang-eksperimentong suporta para sa mga saklaw na walang paunang halaga.

    ary[..3] # katulad ng ary[0..3] rel.where(sales: ..100)

  • Idinagdag ang Enumerable#tally method, na binibilang kung gaano karaming beses nangyayari ang bawat elemento.

    ["a", "b", "c", "b"].tally
    #=> {"a" =>1, "b" =>2, "c" =>1}

  • Pinapayagan na tumawag sa isang pribadong paraan na may literal na "sarili"

    def foo
    dulo
    pribado :foo
    sarili.foo

  • Idinagdag ang Enumerator::Lazy#eager na paraan upang makabuo ng regular na enumeration mula sa isang tamad na enumerator (Enumerator::Lazy).

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.sabik
    p e.class #=> Enumerator
    e.mapa {|x| x + "?" } #=> [“FOO!?”, “BAR!?”, “BAZ!?”]

  • Ang pagbuo ng isang pang-eksperimentong JIT compiler ay nagpatuloy, na maaaring makabuluhang mapabuti ang pagganap ng mga aplikasyon sa wikang Ruby. Ang JIT compiler ni Ruby ay unang nagsusulat ng C code sa disk, at pagkatapos ay tumatawag ng isang panlabas na C compiler upang bumuo ng mga tagubilin sa makina (sumusuporta sa pagtawag sa GCC, Clang, at Microsoft VC++). Ang bagong bersyon ay nagpapatupad ng paraan para sa inline na pag-deploy kung kinakailangan, ang selektibong aplikasyon ng mga mode ng pag-optimize sa panahon ng compilation ay sinisiguro, ang default na halaga ng "--jit-min-calls" ay tinataasan mula 5 hanggang 10000, at "--jit-max- cache” mula 1000 hanggang 100 .
  • Pinahusay na pagganap ng CGI.escapeHTML, Monitor at MonitorMixin.
  • Tinitiyak ng module#name, true.to_s, false.to_s, at nil.to_s na may ibabalik na string na hindi nagbabago para sa tinukoy na object.
  • Ang laki ng mga binary file na nabuo ng RubyVM::InstructionSequence#to_binary; na pamamaraan ay nabawasan.
  • Mga na-update na bersyon ng mga built-in na bahagi, kabilang ang
    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;

  • Ang mga aklatan ay inilipat mula sa batayang pakete patungo sa mga panlabas na pakete ng hiyas
    CMath (cmath hiyas),
    Scanf (scanf gem),
    Shell (shell gem)
    Synchronizer (pag-sync ng hiyas),
    ThreadsWait (thwait gem),
    E2MM (e2mmap gem).

  • Ang mga default na stdlib module ay nai-publish sa rubygems.org:
    benchmark,
    cgi,
    delegado
    getoptlong,
    net-pop,
    net smtp,
    bukas3,
    pstore,
    singleton. Subaybayan ang mga module na hindi inilipat sa rubygems.org
    tagamasid,
    timeout
    tagasubaybay
    uri,
    yaml, na ibinibigay lamang sa ruby-core.

  • Ang Building Ruby ay nangangailangan na ngayon ng isang C compiler na sumusuporta sa pamantayan ng C99.

Pinagmulan: opennet.ru

Magdagdag ng komento