Ruby (ngôn ngữ lập trình) – Wikipedia tiếng Việt

Bài này viết về ngôn ngữ lập trình. Đối với những định nghĩa khác, xem Ruby ( xu thế )Đừng nhầm lẫn với Ruby on Rails

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

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 minh bạch tiên phong 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 những phiên bản sau của Ruby, gồm có phong cách thiết kế hướng đối tượng người dùng, những lớp với kế thừa, mixin, vòng lặp, giải quyết và xử lý ngoại lệ và thu gom rác .Sau khi phát hành Ruby 0.95 vào năm 1995, 1 số ít phiên bản không thay đổi 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 không thay đổi mới nhất là 1.8.3. Ruby 1.9 ( với 1 số ít đổi khác ) cũng đang trong quy trình tăng trưởng .
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 lao lý. Việc quy đổi sang phiên bản 1.9 từ 1.8 đã bị chậm lại do nhiều gems phổ cập cần được viết lại .Ruby 1.9 trình làng nhiều đổi khác đáng kể so với những phiên bản 1.8. Ví dụ :

  • Giới hạn vùng tham chiếu của các biến cục bộ (các biến cục bộ chỉ được sử dụng ở trong các block mà chúng được khai báo)
  • Bổ sung cú pháp lambda:
    f = ->(a,b) { puts a + b }
    
  • Bổ sung cú pháp Hash, sử dụng dấu hai chấm cho các khóa biểu tượng (symbol key):
    {symbol_key: " value "} = = {: symbol_key => " value "}
    
  • Hỗ trợ mã hóa ký tự theo chuỗi.
  • 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 năm ngoái, [ 32 ] và nó sẽ không còn nhận được bản sửa lỗi và bảo mật thông tin nữa. Người dùng nên tăng cấp lên phiên bản mới hơn .

Mục lục bài viết

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-p37504/08/200306/201201/07/2014
1.91.9.3-p55125/12/200723/02/201423/02/2015
2.02.0.0-p64824/02/201324/02/201524/02/2016
2.12.1.1025/12/201330/03/201631/01/2017
2.22.2.1025/12/201428/03/201731/03/2018
2.32.3.825/12/201520/06/201831/03/2019
2.42.4.825/12/201601/04/201901/04/2020
2.52.5.725/12/2017Chưa được công bốChưa được công bố
2.62.6.525/12/2018Chưa được công bốChưa được công bố
2.72.7.025/12/2019Chưa được công bốChưa được công bố
3.02020Chưa được công bốChưa được công bố
Chú thích:

  • Hiện tại Ruby chỉ hỗ trợ phiên bản: 2.4, 2.5, 2.6 và 2.7. Các phiên bản trước đó đã cũ và không còn được hỗ trợ.
  • 2.7 là phiên bản mới nhất của Ruby
  • Phiên bản 3.0 sẽ được phát hành trong tương lai. Hiện tại chưa được phát hành.

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 trực tuyến 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 kiến nghị. Matsumoto chọn tên sau trong email gửi đến Ishitsuka. Sau này Matz cũng giật mình 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à tương thích vì Ruby thừa kế và tăng trưởng nhiều đặc tính từ Perl [ 12 ] [ 13 ] .
Quan điểm chính trong việc phong cách thiết kế của Matz là nhằm mục đích giảm thiểu những việc làm nhàm chán mà họ, những nhà lập trình, buộc phải làm ; tiếp đến là nguyên tắc phong cách thiết kế giao diện người dùng ( user interface ) hiệu suất cao. [ 14 ] Ông nhấn mạnh vấn đề rằng việc phong cách thiết kế mạng lưới hệ thống cần phải tập trung chuyên sâu 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.

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á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 tự do 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 tự do với ngữ nghĩa của nó ( semantics ). Nếu bạn thích Python, bạn hoàn toàn có thể hoặc không hề dừng lại bởi sự độc lạ 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 bắt đầu ( viết tắt là MRI ), bản được dùng thông dụng nhất, và JRuby, bộ thông dịch dựa trên ngôn ngữ Java. Bộ thông dịch Ruby đã được setup trên nhiều nền tảng khác nhau, gồm có Unix, Microsoft Windows, DOS, Mac OS X, OS / 2, Amiga và một số ít 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 gọn .

Quy ước bản quyền[sửa|sửa mã nguồn]

Ruby được phân phối tự do theo ĐK tự do và mã nguồn mở GPL và Ruby License [ 1 ] .
Ruby hiện tại vẫn chưa tương hỗ Unicode, dù chỉ mới tương hỗ trong thời điểm tạm thời cho UTF-8 .

Những yếu tố mới[sửa|sửa mã nguồn]

Mặc dù việc phong cách thiết kế Ruby tuân theo nguyên tắc ít gây quá bất ngờ nhất, nhưng 1 số ít tính năng khác với những 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, ""[] được xem là true: Trong C, biểu thức 0 ? 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ằ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, untilfor, cũng như với iterators.

Lưu ý : Các ví dụ sử dụng chuỗi ký tự Unicode để chạy được cần đặt một biến thiên nhiên và môi trường là USD 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ại ruby và unicode Lưu trữ 2005 – 12-18 tại Wayback Machine

# Mọi thứ, kể cả tầm thường nhất, là một đối tượng người dù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 "
print ' Làm ơn gõ tên > '
name = gets.chomp
puts " Chào# {name}. "
puts ' Cho tôi số lượng 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 số lượng lớn hơ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.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à thiết kế xây dựng một mảng tích 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 người dùng hash riêng không liên quan gì đến nhau mới
puts hash[: fire]                             # Xuất ra " hot "

hash.each_pair do |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 hot

hash.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ố ít ngẫu nhiên và in ra số đó là chẵn hay lẻ .
if rand(100) % 2 = = 0
  puts " Là số chẵn "
else
  puts " 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, quốc tế ! ' } # quan tâm dấu ngoặc
# hoặc :
do
  puts ' Xin chào, quốc tế ! '
end

Một block hoàn toàn 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 lộ " chính sách ghi chép "
  file.puts ' Viết gì đó '
end                                  # Tập tin sẽ tự động hóa đóng ở đây

File.readlines(' file.txt ').each do |line|
  puts line
end
# => ' Viết gì đó '

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

# Trong một biến biểu lộ đối tượng người tiêu dùng ( biểu lộ bằng ' @ ' ), hãy lưu block này .
def remember(và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 ( quan tâm rằng điều này không có vận dụng tự do cho những 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| puts arg}
Proc.new {|arg| puts arg}
lambda {|arg| puts arg}
->(arg) {puts arg}         # được ra mắt ở Ruby 1.9

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

def create_set_and_get(initial_value=0) # Lưu ý initial_value 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 hoàn toàn có thể được sử dụng như thể một link cho closure , # Vậy nên hàm trên hoàn toà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

Trong một hàm, hoàn toàn có thể biến hóa block vào lúc gọi hàm :

  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à mảng bằng cách dùng block :

a = [1, ' chào ', 3.14]
a.each {|item| puts item}          # Xuất ra hàng loạt thành phần
(3..6).each {|num| puts num}       # Xuất ra những số từ 3 đến 6

Block cũng hoàn toàn có thể dùng với những 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 hóa đó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 những số từ 1 đến 10 :

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

Đ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ạo initialize, 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ức to_s (vì thế Kernel#puts có thể định dạng đầu ra của nó). Ở đây, attr_accessor là một ví dụ của meta-programming trong Ruby: nó định nghĩa các phương thức dạng gettersetter của biến thực thể, trong khi 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 là giá trị trả về của nó, điều này cho phép bỏ qua lệnh return.

class Person
  attr_reader: name,: age
  def initialize(name, age)
    @ name, @ age = name, age
  end
  def 

<=>

(person) # Định nghĩa toán tử so sánh @ age

<=>

person.age end def to_s "# {@ name}(# {@ age}) " end end group = [ Person.new(" Bob ", 33) , Person.new(" Chris ", 16) , Person.new(" Ash ", 23) ] puts group.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)

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

raise

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

raise " Đây là một thông tin "

Ngoại lệ cũng hoàn toàn có thể xác lập bởi những lập trình viên :

raise ArgumentError, " Tranh luận phạm 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ến raise như sau:

raise ArgumentError.new(" Tham số không tương thích ! ")

Một vài ví dụ[sửa|sửa mã nguồn]

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

Hệ điều hành quản lý[sửa|sửa mã nguồn]

Ruby hoàn toàn có thể chạy trên những hệ quản lý sau :
Có thể còn thêm một số ít platform khác .

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 tài liệu[sửa|sửa mã nguồn]

Cú pháp trong Ruby tương tự như Perl and Python. 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ủ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.

Liên kết ngoài[sửa|sửa mã nguồn]

Rate this post
Xem thêm  Top 8 Tựa Game Online Cày Cuốc PC Mới Cập Nhật Năm 2020

Bài viết liên quan

Để lại ý kiến của bạn:

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *