Movatterモバイル変換


[0]ホーム

URL:


Bước tới nội dung
WikipediaBách khoa toàn thư mở
Tìm kiếm

Ruby (ngôn ngữ lập trình)

Bách khoa toàn thư mở Wikipedia
Bài này viết về ngôn ngữ lập trình. Đối với các định nghĩa khác, xemRuby (định hướng).
Đừng nhầm vớiRuby on Rails.
Ruby
Mẫu hìnhMulti-paradigm:Object-oriented,imperative,functional,reflective
Thiết kế bởiMatsumoto Yukihiro
Nhà phát triểnMatsumoto Yukihiro, et al.
Xuất hiện lần đầu1995; 30 năm trước (1995)
Phiên bản ổn định
3.4.4 / 14 tháng 5 năm 2025; 6 tháng trước (2025-05-14)[1]
Kiểm tra kiểuDuck,dynamic,strong
Phạm viTừ vựng, đôi khi động
Ngôn ngữ triển khaiC
Hệ điều hànhĐa nền tảng
Giấy phépRuby,GPLv2 hoặc2-clause BSD license[2][3][4]
Phần mở rộng.rb,.rbw, .rbs
Websitewww.ruby-lang.org
Ảnh hưởng bởi
Ada,[5]C++,[5]CLU,[6]Dylan,[6]Eiffel,[5]Lua,Lisp,[6]Perl,[6]Python,[6]Smalltalk[6]

Ruby là mộtngôn ngữ lập trìnhhướng đối tượng, có khả năngphản ứng. Theo tác giả, Ruby chịu ảnh hưởng bởiPerl,Smalltalk,Eiffel,AdaLisp.

Ruby cung cấp nhiềumẫu hình lập trình, bao gồmlập trình hàm,hướng đối tượng,mệnh lệnh,phản xạ. Nó sử dụng hệ thốngkiểu biến động và tự độngquản lý bộ nhớ tự động.

Lịch sử

[sửa |sửa mã nguồn]

Ruby được tạo ra từ24 tháng 2 năm1993, bởi lập trình viên ngườiNhật Bản tên làMatsumoto Yukihiro (松本 行弘), biệt danhMatz. Phiên bản chính thức 0.95 (Đây là phiên bản công khai đầu tiên của Ruby được công bố tạiNhật Bản) vào ngày 21 tháng 12 năm 1995. Ở phiên bản Ruby 0.95, nó đã có nhiều tính năng quen thuộc trong các phiên bản sau của Ruby, bao gồm thiết kếhướng đối tượng, các lớp vớikế thừa, mixin,vòng lặp, xử lý ngoại lệ vàthu gom rác.

Ruby 3.4.0

[sửa |sửa mã nguồn]

Ruby 3.4.0[7] được phát hành vào ngày 25 tháng 12 năm 2024. Phiên bản 3.4.0 cũng cung cấp các nâng cấp về mặt hiệu năng cho các phiên bản Ruby 3.3.x. Phiên bản 3.4.0 này tập trung vào việc bổ sung các tham số chiếu trong tham số khối. Ngoài ra phiên bản cũng lựa chọn Prism là trình phân tích cú pháp măc định và hỗ trợ thêm Happy Eyeballs phiên bản 2 vào thư viện socket, cải thiện YJIT, thêm Modular GC, ...

Các điểm nổi bật chính

[sửa |sửa mã nguồn]
Tham sốit được giới thiệu
[sửa |sửa mã nguồn]

Thay đổi lớn nhất trong phiên bản 3.4.0 của Ruby là việc xuất hiện tham sốit trong block. Tham số này chính là tham chiếu mặc định cho tham số của một block, tương tự như_1, giúp code trong các block đơn giản trở nên dễ đọc hơn. Ví dụ:

["a","b"].map{it.upcase}# -> ["A", "B"]
Prism là trình phân tích cú pháp mặc định
[sửa |sửa mã nguồn]

Chuyển trình phân tích cú pháp mặc định từ parse.y sang Prism.

Việc thay đổi trình phân tích cú pháp mặc định sang Prism là một thay đổi nội bộ trong ngôn ngữ Ruby nên người dùng sẽ thấy ít có sự thay đổi. Để sử dụng trình phân tích cú pháp thông thường, sử dụng đối số dòng lệnh--parser=parse.y.

Hỗ trợ Happy Eyeballs Version 2
[sửa |sửa mã nguồn]

Thư việnsocket được cải tiến để giảm độ trễ kết nối mạng bằng cách thử đồng thời cả địa chỉIPv6IPv4, sau đó chọn kết nối thành công đầu tiên.

Các cải tiến về mặt hiệu năng

[sửa |sửa mã nguồn]
YJIT (Just-In-Time Compiler)
[sửa |sửa mã nguồn]

YJIT tiếp tục được cải thiện, mang lại hiệu năng tốt hơn trên hầu hết các benchmark cho cả nền tàngx86-64arm64. Việc sử dụngbộ nhớ cũng được giảm thiểu và có thêm các tùy chọn dòng lệnh mới để quản lý.

Modular GC (Modular Garbage Collector)
[sửa |sửa mã nguồn]

Ruby 3.4.0 giớ thiệu một hệ thống garbage collector (GC) dạng mô-đun, cho phép tải các trình thu gom rác khác nhau một cách linh hoạt. Đáng chú ý là sự xuất hiên của một trình Garbage Collector thử nghiệm dựa trên MMTk (viết bằngRust) hứa hẹn một hiệu năng cao.

JSON
[sửa |sửa mã nguồn]

Tốc độ củaJSON.parse được cải thiện,nhanh hơn khoảng 1.5 lần so với phiên bản tiền nhiệm.

Các thay đổi quan trọng khác

[sửa |sửa mã nguồn]

Việc thay đổi các chuỗi (string) trong các file không có commentfrozen_string_literal giờ đây sẽ đưa ra cảnh báo không dùng nữa (deprecation warning).

Việc phân tán từ khóanil khi gọi phương thức hiện được hỗ trợ.**nil được xử lý tương tự như**{}, không truyền từ khóa và không gọi bất kỳ phương thức chuyển đổi nào.

Bảng các phiên bản Ruby

[sửa |sửa mã nguồn]
Phiên bảnPhiên bản nâng cấpNgày phát hànhKết thúc giai đoạn hỗ trợKết thúc giai đoạn bảo trì bảo mật
1.0Chưa rõ25/12/1996Chưa rõChưa rõ
1.81.8.7-p37404/08/200306/201201/07/2014
1.91.9.3-p55125/12/200724/02/201423/02/2015
2.02.0.0-p64824/02/201324/02/201624/02/2016
2.12.1.1025/12/201330/03/201631/03/2017
2.22.2.1025/12/201428/03/201731/03/2018
2.32.3.825/12/201528/03/201831/03/2019
2.42.4.1025/12/201601/04/201931/03/2020
2.52.5.925/12/201701/04/202005/04/2021
2.62.6.1025/12/201801/04/202112/04/2022
2.72.7.825/12/201901/04/202231/03/2023
3.03.0.725/12/202001/04/202323/04/2024
3.13.1.625/12/202101/04/202431/03/2025 (dự kiến)
3.23.2.625/12/2022Chưa công bố31/03/2026 (dự kiến)
3.33.3.625/12/2023Chưa công bố31/03/2027 (dự kiến)
3.43.4.414/05/2025Chưa công bốChưa công bố
Chú thích:
  • Hiện tại Ruby chỉ hỗ trợ phiên bản: 3.1, 3.2 và 3.3.[8] Các phiên bản trước đó đã cũ và không còn được hỗ trợ.
  • 3.4.4 là phiên bản mới nhất của Ruby
  • Thông tin các phiên bản Ruby được tham khảo từ các trang Ruby Releases[9] và Ruby Maintenance Branches[8]

Cái tên Ruby

[sửa |sửa mã nguồn]

Nguồn gốc của cái tên "Ruby" là từ một phiên chat online giữa Matsumoto và Ishitsuka Keiji vào ngày 24 tháng 2 năm 1993, trước khi bất kỳ đoạn mã nào được viết cho ngôn ngữ này. Ban đầu, "Coral" và "Ruby" là hai cái tên được đề xuất. Matsumoto chọn tên sau trongemail gửi đến Ishitsuka. Sau này Matz cũng bất ngờ khi phát hiện ra Pearl là viên đá quý tượng trưng cho những người sinh tháng 6, còn Ruby thì tượng trưng cho những người sinh tháng 7. Anh cho rằng cái tên Ruby như thế là phù hợp vì Ruby kế thừa và phát triển nhiều đặc tính từ Perl.[10][11]

Quan điểm

[sửa |sửa mã nguồn]

Quan điểm chính trong việc thiết kế của Matz là nhằm giảm thiểu các công việc nhàm chán mà họ, các nhà lập trình, buộc phải làm; tiếp đến là nguyên tắc thiết kếgiao diện người dùng (user interface) hiệu quả.[12] Ông nhấn mạnh rằng việc thiết kế hệ thống cần phải tập trung vào con người, hơn là vào máy tính:[13]

Often people, especially computer engineers, focus on the machines. They think, "By doing this, the machine will run faster. By doing this, the machine will run more effectively. By doing this, the machine will something something something." They are focusing on machines. But in fact we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves.

Ngôn ngữ Ruby được thiết kế nhằm theonguyên tắc ít gây ngạc nhiên nhất (principle of least surprise-POLS), nghĩa là ngôn ngữ hoạt động theo một cách trực quan hay ít nhất đó cũng là nhận xét mà các nhà lập trình đưa ra. Nguyên tắc này không xuất phát từ Matz và, nói chung, Ruby gần với suy nghĩít ngạc nhiên nhất của 'Matz' hơn.

Ngữ nghĩa

[sửa |sửa mã nguồn]

Ruby là một ngôn ngữ hướng đối tượng: mỗi giá trị đều là một đối tượng (object), bao gồm cáckiểu dữ liệu mà đối với các ngôn ngữ khác, chúng là kiểu cơ bản (primitive) nhưinteger. Mỗi hàm (function) là một phương thức (method). Tên biến (variables) chính là tham chiếu (references) đến các đối tượng, bản thân nó không phải là đối tượng. Ruby hỗ trợkế thừa (inheritance) vớidynamic dispatch,mixinsingleton method (thuộc về, và để định nghĩa cho, mộtinstance đơn hơn là định nghĩa dành cholớp). Mặc dù Ruby không hỗ trợđa kế thừa, các lớp vẫn có thể được đưa vào cácmodule dưới dạng cácmixins. Cú pháp dạng thủ tục (procedural syntax) vẫn còn được hỗ trợ, có vẻ như là ngoài tầm vực của mọi đối tượng, nhưng thực sự là thuộc mộtthể hiện của class Object tên là 'main'. Vì class này là cha của mọi class khác, nó trở trên ẩn đối với mọi lớp và đối tượng.

Ruby được xem là mộtngôn ngữ lập trình đa mẫu hình (multi-paradigm programming language): nó cho phép bạn lập trình dạng thủ tục (tạo ra các hàm/biến nằm ngoài phạm vi của các lớp và biến chúng thành một phần của đối tượng gốc, 'self' Object), với khả năng hướng đối tượng (mọi thứ đều là đối tượng) hayhàm (nó có các hàm không có tên (anonymous functions),closures, vàcontinuations; mọi câu lệnh đều có giá trị trả về, và các hàm đều trả về kết quả ước lượng cuối cùng). Nó hỗ trợ mạnh chotự định kiểu (type introspection),reflectionmeta-programming.

Theo RubyFAQ, "Nếu bạn thíchPerl, bạn sẽ thích Ruby và sẽ thấy thoải mái với cú pháp của nó. Nếu bạn thíchSmalltalk, bạn sẽ thích Ruby và sẽ thấy thoải mái với ngữ nghĩa của nó (semantics). Nếu bạn thíchPython, bạn có thể hoặc không thể dừng lại bởi sự khác biệt lớn trong triết lý hiện thực giữa Python và Ruby/Perl."

Trình thông dịch

[sửa |sửa mã nguồn]

Ruby có hai bản thông dịch chính: bộthông dịch Ruby ban đầu (viết tắt làMRI), bản được dùng phổ biến nhất, và JRuby, bộ thông dịch dựa trên ngôn ngữJava. Bộ thông dịch Ruby đã được cài đặt trên nhiều nền tảng khác nhau, bao gồmUnix,Microsoft Windows,DOS,Mac OS X,OS/2,Amiga và một số nền tảng khác. Bản chính thức của Ruby có kèm theo "IRB", là bộ thông dịch dạng dòng lệnh trực tiếp (interactive command-line interpreter) giúp cho việc kiểm tra code nhanh chóng.

Quy ước bản quyền

[sửa |sửa mã nguồn]

Ruby được phân phối tự do theo đăng kýtự domã nguồn mởGPL và Ruby License[1]Lưu trữ ngày 26 tháng 8 năm 2011 tạiWayback Machine.

Tính năng

[sửa |sửa mã nguồn]

Ruby hiện tại vẫn chưa hỗ trợUnicode, dù chỉ mới hỗ trợ tạm thời choUTF-8.

Những vấn đề mới

[sửa |sửa mã nguồn]

Mặc dù việc thiết kế Ruby tuân theonguyên tắc ít gây ngạc nhiên nhất, nhưng một số tính năng khác với các ngôn ngữ khác nhưC hayPerl:

  • Các tên bắt đầu bằng ký tự hoa được xem là hằng, vì thế biến cục bộ nên bắt đầu bằng ký tự thường.
  • Việc đánh giáBoolean đối với các dữ liệu không phải bool rất chặt chẽ: 0,""[] được xem làtrue: Trong C, biểu thức0 ? 1: 0 được xem là 0. Trong Ruby, tuy nhiên, nó lại trả về 1, vì số 0 được xem là "một cái gì đó"; chỉ cónilfalse mới được xem là bằngfalse. Một hệ luận đối với quy luật này là theo qui ước, các phương thức của Ruby—ví dụ,biểu thức chính quy tìm kiếm — sẽ trả về các số, chuỗi, danh sách etc. nếu thành công, nhưng lại trả vềnil nếu thất bại (ví dụ, không tìm thấy).
  • Để biểu diễn một số thực dấu chấm động, ta phải theo quy tắc dùng ký số zero (99.0) hay chuyển đổi tường minh (99.to_f). Việc dùng dấu chấm là không đủ (99.) vì các số vẫn có thể nhận cú pháp có phương thức.
  • Thiếu một kiểu dữ liệu ký tự ("char"). Điều này có thể gây ngạc nhiên khi duyệt qua chuỗi:"abc"[0] cho ra 97 (một số nguyên, biểu diễn mãASCII của ký tự đầu tiên trong chuỗi); để lấy được"a" dùng"abc"[0,1] (chuỗi con cóchiều dài 1) hay"abc"[0].chr.

Một danh sách các lỗi thường gặp ("gotchas") có thể tra trong cuốn sách của Hal FultonThe Ruby Way, trang 48–64. Tuy nhiên, vì danh sách trong cuốn sách là dựa trên phiên bản cũ của Ruby (version 1.6), một số mục đã được sửa đổi sau khi cuốn sách ấn hành. Ví dụ,retry bây giờ làm việc được vớiwhile,untilfor, cũng như với iterators.

Ví dụ

[sửa |sửa mã nguồn]

Lưu ý: Các ví dụ sử dụng chuỗi ký tựUnicode để chạy được cần đặt mộtbiến môi trường là $KCODE="u". Hay là chạy #ruby với tùy chọn là -K u vẫn được. Xem thêm những hạn chế của phiên bản Ruby hiện tại với Unicode tạiruby và unicodeLưu trữ ngày 18 tháng 12 năm 2005 tạiWayback Machine

# Mọi thứ, kể cả tầm thường nhất, là một đối tượng. Vì thế những ví dụ dưới đều chạy được:-199.abs# => 199, abs: giá trị tuyệt đối"ruby is cool".length# => 12"Rick".index("c")# => 2"Nice Day Isn't It?".split(//).uniq.sort.join# => " '?DINaceinsty"

Input

[sửa |sửa mã nguồn]
print'Làm ơn gõ tên >'name=gets.chompputs"Chào#{name}."

Hội thoại

[sửa |sửa mã nguồn]
puts'Cho tôi con số của bạn'number=gets.chompputsnumber.to_ioutput_number=number.to_i+1putsoutput_number.to_s+' là một con số lớn hơn.'

Mảng

[sửa |sửa mã nguồn]

Khởi tạo và sử dụng một mảng:

a=[1,'chào',3.14,1,2,[4,5]]a[2]# => 3.14a.reverse# => [[4, 5], 2, 1, 3.14, 'chào', 1]a.flatten.uniq# => [1, 'chào', 3.14, 2, 4, 5]

Khởi tạo và xây dựng một mảng kết hợp (Ruby gọi là hash):

hash=Hash.new# Tương đương với hash = {}hash={:water=>'wet',:fire=>'hot'}# Đoạn mã đầu trở nên dư thừa khi# đưa cho hash một đối tượng hash riêng biệt mớiputshash[:fire]# Xuất ra "hot"hash.each_pairdo|key,value|# Hoặc: hash.each do |key, value|puts"#{key} is#{value}"end# Trả về {:water => 'wet',:fire => 'hot'} và xuất ra:# water is wet# fire is hothash.delete:water# Hủy cặp giá trị:water => 'wet' và trả về "wet"hash.delete_if{|key,value|value=='hot'}# Hủy cặp giá trị:fire => 'hot' và trả về {}

Cấu trúc rẽ nhánh

[sửa |sửa mã nguồn]

Mệnh đề If:

# Tạo ra một số ngẫu nhiên và in ra số đó là chẵn hay lẻ.ifrand(100)%2==0puts"Là số chẵn"elseputs"Là số lẻ"end

Block và iterator

[sửa |sửa mã nguồn]

2 cách để tạo một đoạn block:

{puts'Xin chào, thế giới!'}# lưu ý dấu ngoặc# hoặc:doputs'Xin chào, thế giới!'end

Một block có thể được truyền đến một hàm (method) như một tham số tùy chọn. Nhiều hàm được cài sẵn có tham số như vậy:

File.open('file.txt','w')do|file|# 'w' biểu thị "chế độ ghi chép"file.puts'Viết gì đó'end# Tập tin sẽ tự động đóng ở đâyFile.readlines('file.txt').eachdo|line|putslineend# => 'Viết gì đó'

Thông số đi qua block để trở thành closure (ví dụ):

# Trong một biến thể hiện đối tượng (biểu thị bằng '@'), hãy lưu block này.defremember(&p)@block=pend# Dùng hàm trên, cho block đó một cái tên.remember{|ten|puts"Xin chào,#{ten}!"}# Dùng closure (lưu ý rằng điều này không có áp dụng tự do cho các biến khác):!@block.call("Tèo")# Xuất ra "Xin chào, Tèo!"

Tạo ra một hàm ẩn danh:

proc{|arg|putsarg}Proc.new{|arg|putsarg}lambda{|arg|putsarg}->(arg){putsarg}# được giới thiệu ở Ruby 1.9

Trả về closure từ một hàm:

defcreate_set_and_get(initial_value=0)# Lưu ý initial_value là 0closure_value=initial_value[Proc.new{|x|closure_value=x},Proc.new{closure_value}]endsetter,getter=create_set_and_get# Trả về hai giá trịsetter.call(21)getter.call# => 21# Biến tham số cũng có thể được sử dụng như là một liên kết cho closure,# Vậy nên hàm trên có thể được viết lại như sau:defcreate_set_and_get(closure_value=0)[proc{|x|closure_value=x},proc{closure_value}]end

Trong một hàm, có thể thay đổi block vào lúc gọi hàm:

defbfs(e)q=[]e.markyieldeq.pushewhilenotq.empty?u=q.shiftu.edge_iteratordo|v|ifnotv.marked?v.markyieldvq.pushvendendendbfs(e){|v|putsv}

Duyệt lần lượt trên enumation và mảng bằng cách dùng block:

a=[1,'chào',3.14]a.each{|item|putsitem}# Xuất ra toàn bộ phần tử(3..6).each{|num|putsnum}# Xuất ra các số từ 3 đến 6

Block cũng có thể dùng với các hàm dựng sẵn:

File.open('taptin.txt','w+b')do|taptin|taptin.puts'Viết linh tinh gì đó.'end# File được tự động đóng lại tại đây

Hay:

IO.readlines('taptin.txt')do|dòng|# Xử lý từng dòng ở đây.end

Sử dụng enumeration và block để xuất ra lũy thừa 2 của các số từ 1 đến 10:

(1..10).collect{|x|x*x}=>[1,4,9,16,25,36,49,64,81,100]

Lớp

[sửa |sửa mã nguồn]

Đoạn mã sau định nghĩa một lớp tên làPerson. Bên cạnh phương thức khởi tạoinitialize, là phương thức được gọi đến khi cần tạo đối tượng mới, lớp này còn có 2 phương thức khác: một là ghi đè lên toán tử so sánh <=> (vì thếArray#sort có thể sắp xếp theo tuổi) và hai là là ghi đè lên phương thứcto_s (vì thếKernel#puts có thể định dạng đầu ra của nó). Ở đây,attr_accessor là một ví dụ củameta-programming trong Ruby: nó định nghĩa các phương thức dạnggettersetter của biến thực thể, trong khiattr_reader các phương thức dạng 'getter'. Và, câu lệnh cuối cùng trong một phương thức là giá trị trả về của nó, điều này cho phép bỏ qua lệnhreturn.

classPersonattr_reader:name,:agedefinitialize(name,age)@name,@age=name,ageenddef<=>(person)# Định nghĩa toán tử so sánh@age<=>person.ageenddefto_s"#{@name} (#{@age})"endendgroup=[Person.new("Bob",33),Person.new("Chris",16),Person.new("Ash",23)]putsgroup.sort.reverse

Đoạn mã trên in ra ba tên theo tuổi giảm dần:

Bob(33)Ash(23)Chris(16)

Ngoại lệ

[sửa |sửa mã nguồn]

Một trường hợp ngoại lệ được đưa ra với lệnhraise:

raise

Có thể thêm một thông báo tùy chọn:

raise"Đây là một thông báo"

Ngoại lệ cũng có thể xác định bởi cáclập trình viên:

raiseArgumentError,"Tranh luận bất hợp pháp!"

Ngoài ra, một thực thể của lớp Ngoại lệ có thể tạo ra được với biếnraise như sau:

raiseArgumentError.new("Tham số không phù hợp!")

Một vài ví dụ

[sửa |sửa mã nguồn]

Có thể tìm thấy các code mẫu của Ruby dưới dạng các thuật toán tại:

Hệ điều hành

[sửa |sửa mã nguồn]

Ruby có thể chạy trên cáchệ điều hành sau:

Có thể còn thêm một số platform khác.

Cú pháp

[sửa |sửa mã nguồn]

Cú pháp trong Ruby tương tự như Perl andPython. Lớp và phương thức được định nghĩa thông qua các từ khóa, ngoài ra khối (block) còn có thể được định nghĩa bằng cặp dấu ngoặc nhọn{}. Khác với Perl,biến số (variable) không nhất thiết phải bắt đầu bằng dấu$, và nếu sử dụng sẽ thay đổi phạm vi của biến số. Các kí tự xuống dòng (line breaks) cũng như dấu chấm phẩy; phân chia các mệnh đề (statement) với nhau.

Một trong những điểm khác biệt lớn nhất so với Perl và Python là Ruby ẩn hoàn toàn các biến của thực thể (instance) và chỉ có thể truy cập và chỉnh sửa chúng thông qua các phương thức (nhưattr_writer,attr_reader).

Các ứng dụng

[sửa |sửa mã nguồn]

Ruby Application Archive đóng vai trò là một kho lưu trữ đủ loại ứng dụng và các thư viện viết bằng Ruby, với hàng ngàn mục. Mặc dù số lượng ứng dụng sẵn có không lớn bằng với cộng đồng củaPerl hayPython, vẫn có đủ loại công cụ và tiện ích nhằm hỗ trợ cho việc phát triển ngôn ngữ trong tương lai.

Tham khảo

[sửa |sửa mã nguồn]
  1. ^"Ruby 3.4.4 Released".Ruby Programming Language. ngày 14 tháng 5 năm 2025. Truy cập ngày 14 tháng 5 năm 2025.
  2. ^"[ruby] Contents of /trunk/COPYING".Bản gốc lưu trữ ngày 20 tháng 3 năm 2017. Truy cập ngày 2 tháng 5 năm 2015.
  3. ^"[ruby] Contents of /trunk/GPL".Bản gốc lưu trữ ngày 21 tháng 3 năm 2022. Truy cập ngày 2 tháng 5 năm 2015.
  4. ^"[ruby] Contents of /trunk/BSDL".Bản gốc lưu trữ ngày 21 tháng 3 năm 2022. Truy cập ngày 2 tháng 5 năm 2015.
  5. ^abcCooper, Peter (2009).Beginning Ruby: From Novice to Professional. Beginning from Novice to Professional (ấn bản thứ 2). Berkeley: APress. tr. 101.ISBN 1-4302-2363-4.To a lesser extent, Python, LISP, Eiffel, Ada, and C++ have also influenced Ruby.
  6. ^abcdefBini, Ola (2007).Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java. Berkeley: APress. tr. 3.ISBN 1-59059-881-4.It draws primarily on features from Perl, Smalltalk, Python, Lisp, Dylan, and CLU.
  7. ^"Ruby 3.4.0 Released".www.ruby-lang.org. Truy cập ngày 2 tháng 7 năm 2025.
  8. ^ab"Ruby Maintenance Branches".Ruby Programming Language. Truy cập ngày 20 tháng 11 năm 2024.
  9. ^"Ruby Releases".Ruby Programming Language. Truy cập ngày 20 tháng 11 năm 2024.
  10. ^"Bản sao đã lưu trữ".Bản gốc lưu trữ ngày 14 tháng 3 năm 2008. Truy cập ngày 26 tháng 3 năm 2008.
  11. ^"An Interview with the Creator of Ruby". Truy cập ngày 14 tháng 8 năm 2015.
  12. ^"The Ruby Programming Language". Truy cập ngày 14 tháng 8 năm 2015.
  13. ^"The Philosophy of Ruby". Truy cập ngày 14 tháng 8 năm 2015.

Xem thêm

[sửa |sửa mã nguồn]

Liên kết ngoài

[sửa |sửa mã nguồn]
Wikibooks tiếng Anh có chủ đề vềNgôn ngữ lập trình Ruby
Dùng cho kỹ nghệ
Dùng trong giảng dạy
Có giá trị lịch sử
Wikimedia Commons có thêm hình ảnh và phương tiện vềRuby (ngôn ngữ lập trình).
Lấy từ “https://vi.wikipedia.org/w/index.php?title=Ruby_(ngôn_ngữ_lập_trình)&oldid=74495173
Thể loại:
Thể loại ẩn:

[8]ページ先頭

©2009-2025 Movatter.jp