Phát hành ngôn ngữ lập trình Ruby 2.7.0

Sau một năm phát triển xuất bản giải phóng Ruby 2.7.0, một ngôn ngữ lập trình hướng đối tượng động, có hiệu quả cao trong việc phát triển chương trình và kết hợp các tính năng tốt nhất của Perl, Java, Python, Smalltalk, Eiffel, Ada và Lisp. Mã dự án được phân phối theo giấy phép BSD ("BSDL 2 mệnh đề") và "Ruby", đề cập đến phiên bản mới nhất của giấy phép GPL và hoàn toàn tương thích với GPLv3. Ruby 2.7 là bản phát hành lớn thứ bảy được sản xuất như một phần của quy trình phát triển theo kế hoạch, bao gồm dành một năm để cải tiến tính năng và phát hành bản vá 2-3 tháng.

Chính cải tiến:

  • thực nghiệm ủng hộ khớp mẫu (Khớp mẫu) để lặp lại đối tượng đã cho và gán một giá trị nếu có mẫu khớp.

    trường hợp [0, [1, 2, 3]] trong [a, [b, *c]] pa #=> 0
    pb #=> 1
    pc #=> [2, 3] kết thúc

    trường hợp {a: 0, b: 1}
    trong {a: 0, x: 1}
    :không có sẵn
    trong {a: 0, b: var}
    p var #=> 1
    cuối

  • Lớp vỏ tính toán tương tác irb (REPL, Read-Eval-Print-Loop) hiện có khả năng chỉnh sửa nhiều dòng, được triển khai bằng thư viện tương thích với dòng đọc quan hệ, được viết bằng Ruby. Hỗ trợ cho rdoc đã được tích hợp, cho phép xem thông tin tham khảo về các lớp, mô-đun và phương thức được chỉ định trong irb. Làm nổi bật màu các dòng có mã được hiển thị thông qua Binding#irb và kết quả kiểm tra các đối tượng lớp cơ sở được cung cấp.

    Phát hành ngôn ngữ lập trình Ruby 2.7.0

  • Đã thêm trình thu thập rác nhỏ gọn (Compaction GC) có thể chống phân mảnh một vùng bộ nhớ, giải quyết các vấn đề về hiệu suất chậm và tăng mức tiêu thụ bộ nhớ do phân mảnh bộ nhớ xảy ra trong quá trình hoạt động của một số ứng dụng Ruby đa luồng. Để đóng gói các đối tượng vào heap đề xuất Phương pháp GC.compact để giảm số lượng trang bộ nhớ được sử dụng và tối ưu hóa vùng heap cho các hoạt động
    CoW (sao chép khi ghi).

  • Đã tiến hành chuẩn bị phân tách các đối số dựa trên vị trí trong danh sách ("def foo(a,b,c)") và từ khóa ("def foo(key: val)"). Chuyển đổi đối số tự động dựa trên từ khóa và vị trí không được dùng nữa và sẽ không được hỗ trợ trong nhánh Ruby 3.0. Cụ thể, việc sử dụng đối số cuối cùng làm tham số từ khóa, chuyển đối số dựa trên từ khóa làm tham số băm cuối cùng và chia đối số cuối cùng thành tham số vị trí và từ khóa đã không còn được dùng nữa.

    def foo(khóa: 42); kết thúc; foo({key: 42}) #warned
    def foo(**kw); kết thúc; foo({key: 42}) # đã cảnh báo
    def foo(khóa: 42); kết thúc; foo(**{key: 42}) # OK
    def foo(**kw); kết thúc; foo(**{key: 42}) # OK

    def foo(h, **kw); kết thúc; foo(key: 42) # đã cảnh báo
    def foo(h, key: 42); kết thúc; foo(key: 42) #warned
    def foo(h, **kw); kết thúc; foo({key: 42}) # OK
    def foo(h, key: 42); kết thúc; foo({key: 42}) # OK

    def foo(h={}, key: 42); kết thúc; foo("key" => 43, key: 42) # đã cảnh báo
    def foo(h={}, key: 42); kết thúc; foo({"key" => 43, key: 42}) # đã cảnh báo
    def foo(h={}, key: 42); kết thúc; foo({"key" => 43}, key: 42) # OK

    def foo(opt={}); kết thúc; foo(khóa: 42) #OK

    def foo(h, **nil); kết thúc; foo(key: 1) #ArgumentError
    def foo(h, **nil); kết thúc; foo(**{key: 1}) # ArgumentError
    def foo(h, **nil); kết thúc; foo("str" ​​​​=> 1) # ArgumentError
    def foo(h, **nil); kết thúc; foo({key: 1}) # OK
    def foo(h, **nil); kết thúc; foo({"str" ​​​​=> 1}) # OK

    h = {}; def foo(*a) kết thúc; foo(**h) # [] h = {}; def foo(a) kết thúc; foo(**h) # {} và cảnh báo
    h = {}; def foo(*a) a kết thúc; foo(h) # [{}] h = {}; def foo(a) một kết thúc; foo(h) # {}

  • Cơ hội sử dụng tên biến mặc định được đánh số cho các tham số khối.

    [1, 2, 3].mỗi { đặt @1 } # giống như [1, 2, 3].mỗi { |i| đặt tôi }

  • Hỗ trợ thử nghiệm cho các phạm vi không có giá trị ban đầu.

    ary[..3] # tương tự như ary[0..3] rel.where(sale: ..100)

  • Đã thêm phương thức Enumerable#tally, đếm số lần mỗi phần tử xuất hiện.

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

  • Được phép gọi một phương thức riêng tư với chữ "tự"

    defoo
    cuối
    riêng tư :foo
    tự.foo

  • Đã thêm phương thức Enumerator::Lazy#eager để tạo bảng liệt kê thông thường từ bảng liệt kê lười biếng (Enumerator::Lazy).

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.háo hức
    p e.class #=> Bộ liệt kê
    p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"]

  • Sự phát triển của trình biên dịch JIT thử nghiệm vẫn tiếp tục, điều này có thể cải thiện đáng kể hiệu suất của các ứng dụng bằng ngôn ngữ Ruby. Trình biên dịch JIT được đề xuất trong Ruby trước tiên ghi mã C vào đĩa, sau đó nó gọi trình biên dịch C bên ngoài để tạo các lệnh máy (hỗ trợ GCC, Clang và Microsoft VC++). Phiên bản mới triển khai phương pháp triển khai nội tuyến nếu cần thiết, áp dụng có chọn lọc các chế độ tối ưu hóa trong quá trình biên dịch, giá trị mặc định của "--jit-min-calls" được tăng từ 5 lên 10000 và "--jit-max-cache" từ 1000 đến 100.
  • Cải thiện hiệu suất của CGI.escapeHTML, Monitor và MonitorMixin.
  • Mô-đun#name, true.to_s, false.to_s và nil.to_s đảm bảo rằng một chuỗi được trả về không thay đổi đối với đối tượng đã chỉ định.
  • Kích thước của tệp nhị phân được tạo bởi phương thức RubyVM::InstructionSequence#to_binary; đã bị giảm.
  • Phiên bản cập nhật của các thành phần tích hợp, bao gồm
    Bundler 2.1.2, RubyGems 3.1.2,
    Racc 1.4.15,
    CSV 3.1.2, REXML 3.2.3,
    RSS 0.2.8,
    Máy quét chuỗi 1.0.3;

  • Thư viện đã được chuyển từ gói cơ sở sang gói đá quý bên ngoài
    CMath (đá quý cmath),
    Scanf (đá quý quét),
    Vỏ (vỏ ngọc),
    Trình đồng bộ hóa (đá quý đồng bộ),
    ThreadsWait (đá quý thwait),
    E2MM (đá quý e2mmap).

  • Các mô-đun stdlib mặc định được xuất bản trên rubygems.org:
    điểm chuẩn,
    cái,
    đại biểu,
    nhận được,
    nhạc pop,
    smt mạng,
    mở3,
    pstore,
    singleton. mô-đun giám sát không được chuyển sang rubygems.org
    người quan sát,
    hết giờ
    dấu vết,
    ghét,
    yaml, chỉ được cung cấp trong Ruby-core.

  • Việc xây dựng Ruby hiện yêu cầu trình biên dịch C hỗ trợ tiêu chuẩn C99.

Nguồn: opennet.ru

Thêm một lời nhận xét