Ruby (ngôn ngữ lập trình)
![]() | |
Paradigm | Multi-paradigm: Object-oriented, imperative, functional, reflective |
---|---|
Designed by | Yukihiro Matsumoto |
Developer | Yukihiro Matsumoto, et al. |
First appeared | 1995 |
Stable release |
2.4.0
/ December 25, 2016[1] |
Typing discipline | Duck, dynamic, strong |
Scope | Lexical, sometimes dynamic |
Implementation language | C |
OS | Cross-platform |
License | Ruby, GPLv2 or 2-clause BSD license[2][3][4] |
Filename extensions | .rb,.rbw |
Website | Template:Url |
Major implementations | |
Ruby MRI, YARV, Rubinius, MagLev, JRuby, MacRuby, RubyMotion, HotRuby, IronRuby, Mruby | |
Influenced by | |
Ada,[5] C++,[5] CLU,[6] Dylan,[6] Eiffel,[5] Lua, Lisp,[6] Perl,[6] Python,[6] Smalltalk[6] | |
Influenced | |
CoffeeScript, Clojure, Crystal, D, Elixir, Falcon, Groovy, Ioke,[7] Julia,[8] Mirah, Nu,[9] potion, Reia, Rust, Swift[10] | |
|
[11]Ruby là một ngôn ngữ lập trình hướng đối tượng, có khả năng phản ứng. Theo tác giả, Ruby chịu ảnh hưởng bởi Perl, Smalltalk, Eiffel, Ada và Lisp. Ruby là ngôn ngữ thông dịch và hướng đối tượng.
Ruby cung cấp nhiều mẫu hình lập trình, bao gồm lập trình hàm, hướng đối tượng, mệnh lệnh, phản xạ. Nó sử dụng hệ thống kiểu biến động và tự động quản lý bộ nhớ tự động.
Contents
Lịch sử
Ruby được tạo ra bởi Yukihiro "Matz" Matsumoto từ 24 tháng 2 năm 1993 và đưa ra 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ại Nhậ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ới kế thừa, mixin, vòng lặp, xử lý ngoại lệ và thu gom rác.
Sau khi phát hành Ruby 0.95 vào năm 1995, một số phiên bản ổn định của Ruby đã được phát hành trong những năm tiếp theo:
- Ruby 1.0: ngày 25 tháng 12 năm 1996.
- Ruby 1.2: tháng 12 năm 1998.
- Ruby 1.4: tháng 8 năm 1999.
- Ruby 1.6: tháng 9 năm 2000.
Tháng 9 năm 2005, phiên bản ổn định mới nhất là 1.8.3. Ruby 1.9 (với một số thay đổi) cũng đang trong quá trình phát triển.
Ruby 1.9
Ruby 1.9 được phát hành vào ngày Giáng sinh năm 2007. Hiệu quả với Ruby 1.9.3, phát hành ngày 31 tháng 10 năm 2011, Ruby chuyển từ việc được cấp phép kép theo Giấy phép Ruby và GPL để được cấp phép kép theo Giấy phép Ruby và giấy phép BSD hai điều khoản. Việc áp dụng 1,9 đã bị chậm lại bởi những thay đổi từ 1.8 yêu cầu nhiều đá quý bên thứ ba phổ biến được viết lại.
Ruby 1.9 giới thiệu nhiều thay đổi đáng kể trong chuỗi 1.8. Ví dụ:
- chặn các biến cục bộ (các biến cục bộ tới khối mà chúng được khai báo)
- một cú pháp lambda bổ sung:
f = ->(a,b) { puts a + b }
- một cú pháp Hashalal bổ sung sử dụng dấu hai chấm cho các phím biểu tượng:
{symbol_key: "value"} == {:symbol_key => "value"}
- mã hóa ký tự mỗi chuỗi được hỗ trợ
- API socket mới (hỗ trợ IPv6)
- require_relative nhập khẩu an ninh
Ruby 1.9 đã lỗi thời kể từ ngày 23 tháng 2 năm 2015, [32] và nó sẽ không còn nhận được bản sửa lỗi và bảo mật nữa. Người dùng nên nâng cấp lên phiên bản mới hơn.
Bảng các phiên bản Ruby
Phiên bản | Phiên bản nâng cấp | Ngày phát hành | Kết thúc giai đoạn hỗ trợ | Kết thúc giai đoạn bảo trì bảo mật |
---|---|---|---|---|
1.0 | Chưa rõ | 25/12/1996 | Chưa rõ | Chưa rõ |
1.8 | 1,8,7-p375 | 04/08/2003 | 06/2012 | 01/07/2014 |
1.9 | 1.9.3-p551 | 25/12/2007 | 23/02/2014 | 23/02/2015 |
2.0 | 2.0.0-p648 | 24/02/2013 | 24/02/2015 | 24/02/20116 |
2.1 | 2.1.10 | 25/12/2013 | 30/03/2016 | 31/01/2017 |
2.2 | 2.2.10 | 25/12/2014 | 28/03/2017 | 31/03/2018 |
2.3 | 2.3.7 | 25/12/2015 | Chưa được công bố | Chưa được công bố |
2.4 | 2.4.4 | 25/12/2016 | Chưa được công bố | Chưa được công bố |
2.5 | 2.5.1 | 25/12/2017 | Chưa được công bố | Chưa được công bố |
2.6 | 25/12/2018 | Chưa được công bố | Chưa được công bố | |
3.0 | 2020 | Chưa được công bố | Chưa được công bố | |
Chú thích:
|
Cái tên Ruby
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 viết code cho ngôn ngữ này. Ban đầu, "Coral" và "Ruby" là hai cái tên được đề xuất. Matsumoto chọn cái cuối cùng trong email 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 [12][13].
Quan điểm
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ả.[14] Ô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 [15]:
- 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 theo nguyê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
Ruby là một ngôn ngữ hướng đối tượng: mỗi bit dữ liệu đều là một đối tượng (object), bao gồm các kiể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ới dynamic dispatch, mixin và singleton method (thuộc về, và để định nghĩa cho, một instance đơn hơn là định nghĩa dành cho lớ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ác module dưới dạng các mixins. 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ột thể 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ột ngô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) hay hà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 cho tự định kiểu (type introspection), reflection và meta-programming.
Theo Ruby FAQ, "Nếu bạn thích Perl, 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ích Smalltalk, 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ích Python, 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."
Hiện thực ngôn ngữ
Ruby có hai bản hiện thực chính: bộ thông dịch Ruby chính thức, bản được dùng phổ biến nhất, và JRuby, bản hiện thực dựa trên ngôn ngữ Java. Bộ thông dịch Ruby đã được hiện thực trên nhiều platforms khác nhau, bao gồm Unix, Microsoft Windows, DOS, Mac OS X, OS/2, Amiga và một số 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
Ruby được phân phối tự do theo đăng ký tự do và mã nguồn mở GPL và Ruby License [1].
Tính năng
- Hướng đối tượng
- Xử lý ngoại lệ
- Iterator và closures (dựa vào cách truyền một khối lệnh)
- Native, biểu thức chính quy như Perl ở mức độ ngôn ngữ
- Chồng toán tử (operator overloading)
- thu hồi rác tự động
- Tính khả chuyển cao (portable)
- Có thể chạy đa luồng (multi-threading) trên mọi platforms
- Khả năng nạp động các DLL/thư viện chia sẻ trên hầu hết mọi platforms.
- Tự kiểm tra (introspection), reflection và meta-programming
- Rất nhiều thư viện chuẩn
- Hỗ trợ dependency injection
- Continuation và generator (xem ví dụ tại RubyGarden: continuations và generators)
- Dùng khối lệnh (code block)
Ruby hiện tại vẫn chưa hỗ trợ Unicode, dù chỉ mới hỗ trợ tạm thời cho UTF-8.
Những vấn đề mới
Mặc dù việc thiết kế Ruby tuân theo nguyê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 hay Perl:
- 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,
""
và[]
đượ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ónil
vàfalse
chỉ mới được xem là bằng false. 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 Fulton The 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ới while
, until
và for
, cũng như với iterators.
Ví dụ
Lưu ý: Các ví dụ sử dụng chuỗi ký tự Unicode để chạy được cần đặt một biến môi trường là $KCODE="u". Hay là chạy #ruby với tùy chọn là -K u cũng được. Xem thêm những hạn chế của phiên bản Ruby hiện tại với Unicode tại ruby và unicode
Một số ví dụ cơ bản với Ruby (được dịch ra tiếng Việt):
# 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
print 'Làm ơn gõ tên >'
name = gets.chomp
puts "Chào #{name}."
Một cuộc trò chuyện
puts 'Đưa tôi số của bạn'
number = gets.chomp
puts number.to_i
output_number = number.to_i + 1
puts output_number.to_s + ' là một con số lớn hơn.'
Sưu tập
Khởi tạo và sử dụng một hàng số:
a = [1, 'chào', 3.14, 1, 2, [4, 5]]
a[2] # 3.14
a.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 = {:nước => 'ướt',:lửa => 'nóng'} #chúng tôi đang làm chúng trở nên dư thừa
# đưa cho hash một đối tượng hash riêng biệt mới
puts hash[:lửa] # Xuất ra "nóng"
hash.each_pair do |từ khóa, giá trị| # hoặc: hash.each do |từ khóa, giá trị|
puts "#{từ khóa} thì #{giá trị}"
end
# biến thành {:nước=>"ướt",:lửa=>"nóng"} và xuất:
# nước thì ướt
# lửa thì nóng
hash.delete:nước # hủy cặp:nước => 'ướt' và biến thành "ướt"
hash.delete_if {|từ khóa, giá trị| từ khóa == 'nóng'} # hủy cặp:lửa => 'nóng' và biến thành {}
Điều khiển kết cấu
Nếu nói rằng:# Tạo ra một số ngẫu nhiên và phân biệt chẵn hay lẻ.
if rand(100) % 2 == 0
puts "Là số chẵn"
else
puts "Là số lẻ"
end
Block và iterator (khối và vòng lặp)
2 cách để tạo một code block:
{ puts 'Xin chào, thế giới!' } # lưu ý dấu ngoặc # hoặc: do puts 'Xin chào, thế giới!' end
Block có thể là một tham số (trở thành một closure (đóng kín)):
Một code block có thể được thông qua một hàm (method) như một tham số block tùy chọn. Nhiều hàm được built-in có những công thức như sau:File.open('file.txt', 'w') do |file| # 'w' biểu thị "chế độ ghi chép"
file.puts 'Ghi chữ vào.'
end # tập tin sẽ tự động đóng ở đây
File.readlines('file.txt').each do |line|
puts line
end
# => Ghi chữ vào.
# Trong một biến thể hiện đối tượng (biểu thị bằng '@'), hãy nhớ đến block.
def remember(&p)
@block = p
end
# 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ó tác dụng trên bất kỳ biến miễn phí):!
@block.call("Tèo") # Xuất ra "Xin chào, Tèo!"
proc {|arg| puts arg}
Proc.new {|arg| puts arg}
lambda {|arg| puts arg}
->(arg) {puts arg} # được dùng trong Ruby 1.9
def create_set_and_get(initial_value=0) # lưu ý các giá trị mặc định là 0
closure_value = initial_value
[ Proc.new {|x| closure_value = x}, Proc.new { closure_value } ]
end
setter, 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 biến trên có thể được viết lại như sau:
def create_set_and_get(closure_value=0)
[ proc {|x| closure_value = x }, proc { closure_value } ]
end
def bfs(e)
q = []
e.mark
yield e
q.push e
while not q.empty?
u = q.shift
u.edge_iterator do |v|
if not v.marked?
v.mark
yield v
q.push v
end
end
end
bfs(e) {|v| puts v}
Duyệt lần lượt trên enumation và array bằng cách dùng block:
a = [1, 'chào', 3.14]
a.each {|item| puts item} # Xuất ra toàn bộ phần tử
(3..6).each {|num| puts num} # Xuất ra các số từ 3 đến 6
Block cũng có thể dùng với các hàm built-in:
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
Đoạn mã sau định nghĩa một class tên là Person. Bên cạnh phương thức 'initialize', là hàm tạo dùng để tạo ra đối tượng mới, nó có 2 phương thức khác: một là override toán tử so sánh <=> (vì thế Array#sort
có thể sắp xếp theo tuổi) và cái còn lại là override phương thức to_s
(vì thế Kernel#puts
có thể định dạng dữ liệu ra của nó). Ở đây, "attr_reader
" là một ví dụ của meta-programming trong Ruby: "attr" định nghĩa các phương thức dạng 'getter' và 'setter' của instance variables; "attr_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 (method) là giá trị trả về, cho phép bỏ qua việc chỉ định 'return' một cách tường minh.
class Nguoi
def initialize(ten, tuoi)
@ten, @tuoi = ten, tuoi
end
def <=>(nguoi)
@tuoi <=> nguoi.tuoi
end
def to_s
"#{@ten} (#{@tuoi})"
end
attr_reader:ten,:tuoi
end
group = [ Nguoi.new("Tèo", 10),
Person.new("Tí", 13),
Person.new("Bác Ba", 64)
]
puts group.sort.reverse
Đoạn mã trên in ra 2 tên theo tuổi giảm dần:
Bác Ba (64)
Tí (13)
Tèo (10)
Trường hợp ngoại lệ
Một trường hợp ngoại lệ được nâng cao với lệnhraise
:raise
raise "Đây là một thông báo"
raise ArgumentError, "Tranh luận bất hợp pháp!"
raise
như sau:raise ArgumentError.new("Tranh luận bất hợp pháp!")
Một vài ví dụ
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
Ruby có thể chạy trên các hệ điều hành sau:
- Các họ hàng của Unix
- DOS
- Microsoft Windows 95/98/XP/NT/2000/2003
- Mac OS X
- BeOS
- Amiga
- Acorn RISC OS
- OS/2
- Syllable
Có thể còn thêm một số platform khác.
Chương trình "Hello world"
viết dòng này vào file hello.rb
puts "chao The gioi"
và chạy thử
~>ruby hello.rb
Các kiểu dữ liệu
Cú pháp
Cấp phát bộ nhớ
Con trỏ
Các ứng dụng
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ủa Perl hay Python, 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
- ↑ "Ruby 2.4.0 Released". Ruby Programming Language. 2016-12-25. Retrieved 2016-12-26.
- ↑ "[ruby] Contents of /trunk/COPYING". Retrieved 2 May 2015.
- ↑ "[ruby] Contents of /trunk/GPL". Retrieved 2 May 2015.
- ↑ "[ruby] Contents of /trunk/BSDL". Retrieved 2 May 2015.
- ↑ 5,0 5,1 5,2
Cooper, Peter (2009). Beginning Ruby: From Novice to Professional. Beginning from Novice to Professional (2nd ed.). Berkeley: APress. p. 101. ISBN 1-4302-2363-4.
To a lesser extent, Python, LISP, Eiffel, Ada, and C++ have also influenced Ruby.
- ↑ 6,0 6,1 6,2 6,3 6,4 6,5
Bini, Ola (2007). Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java. Berkeley: APress. p. 3. ISBN 1-59059-881-4.
It draws primarily on features from Perl, Smalltalk, Python, Lisp, Dylan, and CLU.
- ↑
Bini, Ola. "Ioke". Ioke.org. Retrieved 2011-07-21.
inspired by Io, Smalltalk, Lisp and Ruby
- ↑ "Introduction — Julia Language 0.4.1 documentation". Retrieved 13 November 2015.
- ↑ Burks, Tim. "About Nu™". Programming Nu™. Neon Design Technology, Inc. Retrieved 2011-07-21.
- ↑ Lattner, Chris (2014-06-03). "Chris Lattner's Homepage". Chris Lattner. Retrieved 2014-06-03.
The Swift language is the product of tireless effort from a team of language experts, documentation gurus, compiler optimization ninjas, and an incredibly important internal dogfooding group who provided feedback to help refine and battle-test ideas. Of course, it also greatly benefited from the experiences hard-won by many other languages in the field, drawing ideas from Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.
- ↑ https://en.wikipedia.org/wiki/Ruby_(programming_language). Unknown parameter
|tiêu đề=
ignored (help); Missing or empty|title=
(help) - ↑ http://www.garyc40.com/2008/02/ruby-ky-niem-sinh-nhat-tron-15-tuoi/
- ↑ http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html. Unknown parameter
|ngày truy cập=
ignored (help); Unknown parameter|tiêu đề=
ignored (help); Missing or empty|title=
(help) - ↑ http://www.informit.com/articles/article.asp?p=18225. Unknown parameter
|ngày truy cập=
ignored (help); Unknown parameter|tiêu đề=
ignored (help); Missing or empty|title=
(help) - ↑ http://www.artima.com/intv/ruby4.html. Unknown parameter
|ngày truy cập=
ignored (help); Unknown parameter|tiêu đề=
ignored (help); Missing or empty|title=
(help)
Xem thêm
- Duck typing
- RubyGems (tiện ích quản lý các gói viết bằng Ruby)
- Ruby on Rails (một framework dành cho phát triển ứng dụng Web viết cho Ruby)
Liên kết ngoài
- Ruby language home page
- Giáo trình Tự học Ruby bằng tiếng Việt
- Ruby Garden
- Programming Ruby—Full text of first edition of the book by David Thomas & Andrew Hunt, ISBN 0-201-71089-7
- Why's Poignant Guide to Ruby
- Learning to Program very basic tutorial for non-programmers
- About the name 'Ruby'
- Ruby FAQ
- Quick Reference
- Ruby Application Archive (RAA)
- JRuby
- The Ruby Documentation project
- Ruby Forum
- RubyForge
- RedHanded—Daily Ruby news and more
- Ruby Newcomers Advice
- Getting started with Ruby
- RubyGems—the Ruby standard for publishing and managing third party libraries
- VnRuby—Hội nghiên cứu ứng dụng ngôn ngữ Ruby của Việt Nam
- Full Ruby on Rails Tutorial
Template:Các ngôn ngữ lập trình chính Template:Thể loại Commons
Thể loại:Lập trình hướng đối tượng Thể loại:Ngôn ngữ văn lệnh Thể loại:Tiêu chuẩn ISO Thể loại:Ngôn ngữ lập trình hướng đối tượng