Ruby бағдарламалау тілінің шығарылымы 2.7.0

Бір жылдық дамудан кейін жарияланған босату Ruby 2.7.0, бағдарлама жасауда жоғары тиімді және Perl, Java, Python, Smalltalk, Eiffel, Ada және Lisp ең жақсы мүмкіндіктерін қамтитын динамикалық объектіге бағытталған бағдарламалау тілі. Жоба коды BSD («2-тармақ BSDL») және «Ruby» лицензиялары бойынша таратылады, ол GPL лицензиясының соңғы нұсқасына сілтеме жасайды және GPLv3-пен толық үйлесімді. Ruby 2.7 жоспарланатын әзірлеу процесінің жетінші негізгі шығарылымы болып табылады, ол мүмкіндіктерді жақсартуға бір жыл бөлуді және 2-3 айлық патч шығарылымын қамтиды.

басты жақсартулар:

  • Тәжірибелік Қолдау үлгі сәйкестігі (Үлгіні сәйкестендіру) берілген нысанды қайталау және үлгі сәйкестігі болса мәнді тағайындау.

    [a, [b, *c]] ішіндегі [0, [1, 2, 3]] жағдайы pa #=> 0
    pb #=> 1
    pc #=> [2, 3] соңы

    жағдай {a: 0, b: 1}
    {a:0,x:1}
    :қолжетімсіз
    {a: 0, b: var}
    p var #=> 1
    соңы

  • irb интерактивті есептеулер қабығы (REPL, Read-Eval-Print-Loop) енді оқу сызығымен үйлесімді кітапхана арқылы жүзеге асырылатын көп жолды өңдеу мүмкіндігіне ие. қайта сызуRuby тілінде жазылған. irb жүйесінде көрсетілген сыныптар, модульдер және әдістер туралы анықтамалық ақпаратты көруге мүмкіндік беретін rdoc қолдауы біріктірілген. Binding#irb арқылы көрсетілген кодпен жолдарды түрлі-түсті бөлектеу және базалық сынып нысандарын тексеру нәтижелері берілген.

    Ruby бағдарламалау тілінің шығарылымы 2.7.0

  • Кейбір көп ағынды Ruby қолданбаларының жұмысы кезінде орын алатын жадтың фрагментациясына байланысты баяу өнімділік және жадты тұтынудың жоғарылауы мәселелерін шеше отырып, жад аймағын дефрагментациялай алатын ықшам қоқыс жинағыш (Compaction GC) қосылды. Объектілерді үйіндіге орау үшін ұсынылған GC.compact әдісі пайдаланылатын жад беттерінің санын азайту және операциялар үшін үйінді оңтайландыру
    Сиыр (жазуға көшіру).

  • Орындалған тізімдегі орынға («def foo(a,b,c)») және кілт сөздерге («def foo(key: val)») негізделген аргументтерді бөлуге дайындалу. Кілт сөздер мен позицияға негізделген аргументтерді автоматты түрлендіру ескірген және Ruby 3.0 тармағында қолдау көрсетілмейді. Атап айтқанда, соңғы аргументті кілт сөз параметрлері ретінде пайдалану, кілт сөзге негізделген аргументтерді соңғы хэш параметрі ретінде беру және соңғы аргументті позициялық және кілт сөз параметрлеріне бөлу ескірген.

    def foo(кілт: 42); Соңы; foo({кілт: 42}) #ескерту
    def foo(**kw); Соңы; foo({кілт: 42}) #ескерту
    def foo(кілт: 42); Соңы; foo(**{кілт: 42}) # Жарайды
    def foo(**kw); Соңы; foo(**{кілт: 42}) # Жарайды

    def foo(сағ, **кв); Соңы; foo(кілт: 42) #ескерту
    def foo(h, перне: 42); Соңы; foo(кілт: 42) #ескерту
    def foo(сағ, **кв); Соңы; foo({кілт: 42}) # Жарайды
    def foo(h, перне: 42); Соңы; foo({кілт: 42}) # Жарайды

    def foo(h={}, кілт: 42); Соңы; foo("key" => 43, кілт: 42) #ескертілді
    def foo(h={}, кілт: 42); Соңы; foo({"key" => 43, кілт: 42}) # ескертілді
    def foo(h={}, кілт: 42); Соңы; foo({"key" => 43}, перне: 42) # Жарайды

    def foo(opt={}); Соңы; foo( перне: 42 ) # Жарайды

    def foo(h, **нөл); Соңы; foo(кілт: 1) # ArgumentError
    def foo(h, **нөл); Соңы; foo(**{кілт: 1}) # ArgumentError
    def foo(h, **нөл); Соңы; foo("str" ​​=> 1) # ArgumentError
    def foo(h, **нөл); Соңы; foo({кілт: 1}) # Жарайды
    def foo(h, **нөл); Соңы; foo({"str" ​​=> 1}) # Жарайды

    h = {}; def foo(*a) end; foo(**сағ) # [] h = {}; def foo(a) end; foo(**h) # {} және ескерту
    h = {}; def foo(*a) end; foo(h) # [{}] h = {}; def foo(a) end; foo(h) # {}

  • Қабілеті блок параметрлері үшін әдепкі бойынша нөмірленген айнымалы атауларды пайдалану.

    [1, 2, 3].əрбір { @1 қояды } # ұнайды [1, 2, 3].əрқайсысы { |i| мен қояды}

  • Бастапқы мәні жоқ ауқымдарға эксперименттік қолдау.

    ary[..3] # бірдей ary[0..3] rel.where(сатылым: ..100)

  • Әрбір элемент қанша рет орын алатынын есептейтін Enumerable#tally әдісі қосылды.

    ["a", "b", "c", "b"].санақ
    #=> {"a"=>1, "b"=>2, "c"=>1}

  • Жеке әдісті шақыруға "self" литералы рұқсат етіледі

    деффу
    соңы
    жеке: foo
    self.foo

  • Жалқау (Санаушы::Жалқау) тізімнен тұрақты тізімді жасау үшін қосылған Enumerator::Lazy#eager әдісі.

    a = %w(foo bar baz)
    e = а.жалқау.карта {|x| x.upcase }.карта {|x| x + "!" }.асығар
    p e.class #=> Санақ
    e.карта {|x| x + "?" } #=> [“FOO!?”, “BAR!?”, “BAZ!?”]

  • Эксперименттік JIT компиляторын әзірлеу жалғасты, ол Ruby тіліндегі қолданбалардың өнімділігін айтарлықтай жақсарта алады. Ruby-де ұсынылған JIT компиляторы алдымен дискіге C кодын жазады, содан кейін ол машина нұсқауларын жасау үшін сыртқы C компиляторын шақырады (GCC, Clang және Microsoft VC ++ қолдау көрсетіледі). Жаңа нұсқа қажет болған жағдайда кірістірілген орналастыру әдісін жүзеге асырады, компиляция кезінде оңтайландыру режимдерін таңдап қолдану, «--jit-min-қоңыраулар» әдепкі мәні 5-тен 10000-ға дейін ұлғайтылды және «--jit-max-cache» 1000-нан 100-ге дейін.
  • CGI.escapeHTML, Monitor және MonitorMixin жақсартылған өнімділік.
  • Module#name, true.to_s, false.to_s және nil.to_s көрсетілген нысан үшін өзгеріссіз жолдың қайтарылуын қамтамасыз етеді.
  • RubyVM::InstructionSequence#to_binary әдісі арқылы жасалған екілік файлдардың өлшемі кішірейтілді;
  • Кірістірілген құрамдастардың жаңартылған нұсқалары, соның ішінде
    Bundler 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    String Scanner 1.0.3;

  • Кітапханалар негізгі таратудан сыртқы асыл тас пакеттеріне көшті
    CMath (cmath асыл тас),
    Scanf (scanf асыл тас),
    Қабық (қабық тас),
    Синхронизатор (синхрондау асыл тас),
    ThreadsWait (күту асыл тас),
    E2MM (e2mmap асыл тас).

  • Әдепкі stdlib модульдері rubygems.org сайтында жарияланған:
    эталон,
    cgi,
    делегат,
    getoptlong,
    таза поп,
    таза smtp,
    ашық3,
    дүкен,
    синглтон. Монитор модульдері rubygems.org сайтына жылжытылмаған
    бақылаушы,
    үзіліс,
    бақылаушы,
    uri,
    yaml, олар тек рубин ядросымен жеткізіледі.

  • Ruby құру енді C99 стандартын қолдайтын C компиляторын қажет етеді.

Ақпарат көзі: opennet.ru

пікір қалдыру