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

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 .

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 .

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):

1 # 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:2 -199.abs                           # 199 abs: giá trị tuyệt đối3 "ruby is cool".length                          # 124 "Rick".index("c")                              # 25 "Nice Day Isn't It?".split(//).uniq.sort.join  # " '?DINaceinsty"

Input

print 'Làm ơn gõ tên >'name = gets.chompputs "Chào #{name}."

Một cuộc trò chuyện

puts 'Đưa tôi số của bạn'number = gets.chompputs number.to_ioutput_number = number.to_i + 1puts 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ố:
1 a = [1, 'chào', 3.14, 1, 2, [4, 5]]2 3 a[2]                      # 3.144 a.reverse                 # [[4, 5], 2, 1, 3.14, 'chào', 1]5 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ớiputs 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ónghash.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

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.
 1 class Nguoi 2   def initialize(ten, tuoi) 3     @ten, @tuoi = ten, tuoi 4   end 5  6   def <=>(nguoi) 7     @tuoi <=> nguoi.tuoi 8   end 9 10   def to_s11     "#{@ten} (#{@tuoi})"12   end13 14   attr_reader:ten,:tuoi15 end16 17 group = [ Nguoi.new("Tèo", 10), 
18           Person.new("Tí", 13), 
19           Person.new("Bác Ba", 64) 
20         ]21 22 puts group.sort.reverse
Đoạn mã trên in ra 2 tên theo tuổi giảm dần:
1  Bác Ba (64)2  Tí (13)3  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ệnh raise:
raise
Một thông báo tùy chọn có thể cho là một ngoại lệ:
raise "Đây là một thông báo"
Ngoại lệ cũng có thể xác định bởi các lập trình viên:
raise ArgumentError, "Tranh luận bất hợp pháp!"
Ngoài ra, một trường hợp ngoại lệ có thẻ chấp nhận được với biến raise như sau:
raise ArgumentError.new("Tranh luận bất hợp pháp!")

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 ứ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.