Cha đẻ của Ruby là Matshumoto Yukishiro hay còn được biết đến với tên Matz. Ruby là sự kết hợp thành công của Smalltalk, Python, Perl,... Ruby mang đầy đủ các đặc điểm ưu việt của các ngôn ngữ đã có từ trước đó như: tính thông dịch (Perl, Python), hướng đối tượng (Smalltalk, Java). Phiên bản hiện tại của Ruby là 2.0.Ruby có cú pháp đơn giản. Mang đặc điểm của nhiều ngôn ngữ khác: hướng đối tượng (class, method, object…), chồng toán tử (operation overloading), Xử lý các ngoại lệ (Exception handling), trình gom và xử lí rác (garbage collection), nhập liệu tự động (dynamic loading) và độc lập trong cấu trúc, dependency injection, iterator. Ngoài các đặc điểm chung, Matz cũng đưa vào một số khái niệm khác như mixin, singleton method, renaming, closures… tính khả chuyển cao (high transportability) nên chạy được trên nhiều nên khác nhau như: Unices, Windows, DOS, OSX, OS2, Amiga… Ruby cũng hỗ trợ rất nhiều thư viện chuẩn cho lập trình viên.
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
KHOA CÔNG NGHỆ THÔNG TIN -
BÁO CÁO CÁC VẤN ĐỀ HIỆN ĐẠI BỘ MÔN
CÔNG NGHỆ PHẦN MỀM
ĐỀ TÀI: TÌM HIỂU NGÔN NGỮ RUBY
Giảng viên: TS Võ Đình Hiếu Các sinh viên: Phan Duy Toàn
Nguyễn Văn Nội
Trang 2LỜI MỞ ĐẦU 3
NỘI DUNG 4
I Phân công công việc 4
II Tổng quan về Ruby 4
1 Giới thiệu chung về Ruby 4
2 Ruby cơ bản 4
a Cấu trúc một chương trình Ruby 4
b Các dạng dữ liệu và đối tượng 5
c Toán tử trong Ruby 7
d Các cấu trúc điều khiển 8
e Các cấu trúc lặp và liệt kê 10
f Cấu trúc liệt kê 11
g Ngoại lệ 13
h Các từ khóa điều khiển 13
i Methods, procs, lamdas và Closures 14
k Thừa kế trong Ruby 18
3 Ruby nâng cao 18
a Hướng đối tượng 18
b Cơ sở dữ liệu 20
c Ứng dụng Web 20
d Gửi Email 20
e Lập trình Socket 20
f Web Service 21
g Ruby/Tk 21
h Ruby/LDAP 21
i Đa luồng 22
Trang 34 Framework trên Ruby 22
5 Ruby vs C và Perl 23
III Cài đặt chương trình 24
1 Cài đặt Ruby 24
2 Demo ví dụ Ruby 25
IV Tổng Kết 25
Tài liệu tham khảo 26
Trang 4LỜI MỞ ĐẦU
Trước hết, chúng em xin cảm ơn thầy Võ Đình Hiếu đã tận tình hướng dẫn và tạođiều kiện cho chúng em hoàn thành báo cáo này
Trong báo cáo này chúng em trình bày gồm 4 phần chính:
Phần I Phân công công việc của nhớm
Phần II Trình bày tổng quan về ngôn ngữ lập trình Ruby
Phần III Trình bày các cú pháp lệnh, ngữ nghĩa, cấu trúc chương trình cùng một sốcấu trúc thông dụng trong Ruby
Phần IV Các tài liệu mà chúng tôi đã tham khảo và sử dụng để hoàn thành báo cáonày
Ngoài ra, phần kết luận là tổng kết những gì chúng tôi có được sau khi tìm hiểu vềngôn ngữ lập trình Ruby
Do công việc tìm hiểu và viết báo cáo trong thời gian chúng tôi làm cùng với cácmôn khác nên có thể còn nhiều thiếu sót Vì vậy, mong thầy và các bạn góp ý chochúng tôi để chúng tôi có thể hoàn thành tốt hơn báo cáo này
Chân thành cảm ơn!
Trang 5NỘI DUNG
I Phân công công việc
Bảng1: bảng phân công công việc
Tìm hiểu chung về Ruby
xx
x
II Tổng quan về Ruby
1 Giới thiệu chung về Ruby
Cha đẻ của Ruby là Matshumoto Yukishiro hay còn được biết đến với tên Matz Ruby
là sự kết hợp thành công của Smalltalk, Python, Perl, Ruby mang đầy đủ các đặcđiểm ưu việt của các ngôn ngữ đã có từ trước đó như: tính thông dịch (Perl, Python),hướng đối tượng (Smalltalk, Java) Phiên bản hiện tại của Ruby là 2.0
Ruby có cú pháp đơn giản Mang đặc điểm của nhiều ngôn ngữ khác: hướng đốitượng (class, method, object…), chồng toán tử (operation overloading), Xử lý cácngoại lệ (Exception handling), trình gom và xử lí rác (garbage collection), nhập liệu
tự động (dynamic loading) và độc lập trong cấu trúc, dependency injection, iterator.Ngoài các đặc điểm chung, Matz cũng đưa vào một số khái niệm khác như mixin,singleton method, renaming, closures… tính khả chuyển cao (high transportability)nên chạy được trên nhiều nên khác nhau như: Unices, Windows, DOS, OSX, OS/2,Amiga… Ruby cũng hỗ trợ rất nhiều thư viện chuẩn cho lập trình viên
2 Ruby cơ bản
Cũng như các ngôn ngữ lập trình khác, Ruby cũng có các quy định về cú pháp, kiểu
dữ liệu, các cấu trúc điều khiển luồng, các toán tử…
a Cấu trúc một chương trình Ruby
Là một dạng của ngôn ngữ lập trình thế hệ thứ 3 (3GL: 3rd Generation Language), mộttrương trình Ruby bao gồm các thư viện liên kết và các đoạn mã được phân chia theokhối (code block) Bên cạnh đó với đặc điểm là ngôn ngữ thông dịch được viết theodạng script, chương trình không cần hàm main mà được thực thi theo thứ tự các dòngmã
Trang 6Một chương trình có thể lưu trong nhiều tập tin mã nguồn khác nhau và được sử dụng
lại thông qua cấu trúc lệnh : require hoặc path
Khai báo trong Ruby không quá phức tạp như các ngôn ngữ khác vì không yêu cầuxác định kiểu dữ liệu trong cấu trúc khai báo
Ví dụ:
myString = 'This is my String'
myInt = 5
b Các dạng dữ liệu và đối tượng
Ruby là một ngôn ngữ hướng đối tượng 100% Ở đây các thành phần dữ liệu từ số, ký
tự, mảng… đều được xây dựng trên cơ sở các lớp
Số
Cấu trúc phân cấp dữ liệu dạng số trong Ruby:
Các dạng dữ liệu kiểu số được xây dựng từ lớp Numeric Kiểu số nguyên :Integer có hai dạng là Fixnum với độ dài 31 bits và Bignum có độ dài tùy ý Kiểu
số thực được thể hiện qua lớp Float Bên cạnh đó một số kiểu dữ liệu khác không
có sẵn nhưng được định nghĩa trong các thư viện chuẩn của Ruby
Ký tự
String là lớp dùng để thể hiện chuỗi ký tự Khác với Java String trong Ruby là
“mutable” String trong Ruby có thể được khai báo trong dấu ngoặc đơn hoặc
ngoặc kép Với dạng chuỗi được đặt trong dấu nháy đơn ‘’ thì ký tự \ chỉ có ýnghĩa khi sau nó là ký tự \ hoặc ‘ Bên cạnh đó chuỗi trong nháy đơn được viếtxuống dòng thì nó sẽ được hiển thị thành nhiều dòng tương ứng
Với dạng chuối trong dấu nháy kép “” thì nhiều ký tự đặc biệt được hỗ trợ, ví dụnhư \n, \t như trong java Bên cạnh đó chuỗi trong dấu nháy kép còn có thể hiệnthị kết quả của biểu thức trong nó thông qua ký tự #
Ví dụ :
string = "So PI co gia tri la #{Math::PI}"
puts string
Trang 7Sẽ hiển thị kết quả là: So PI co gia tri la 3.14159265358979
Mảng
Mảng có thể khai báo trực tiếp hoặc thông qua đối tượng Array:
arr = [1,2,3,4,5,6]
arr = Array.newCách đánh chỉ số mảng trong Ruby cũng tương tự như trong java tức là từ 0 đến
số phần tử -1 Tuy nhiên có một điều khác biệt ở chố các chỉ số 0 Một điểm đặcbiệt nữa là trong Ruby, việc sắp xếp các thành phần mảng khá linh hoạt và mềmdẻo Ta có thể khai báo mảng một chiều gồm các phần tử đơn: arr = [1,2,3,4,5,6].Hoặc mảng lồng: arr = [[1,2],[3,4,5,6],[7,8,9]] Hoặc mảng được tríchxuất subArr = arr[0,2] #subArr = [[1,2],[3,4,5,6]] Các mảng có thể tương tác vớinhau thông qua các toán tử như +,-,*…
Với phép + ta có thể cộng hai mảng với nhau:
c Toán tử trong Ruby
Bảng dưới đây mô tả các toán tử trong Ruby với thứ tự ưu tiên từ cao xuống thấp
Trang 8N: Số toán hạng
A: Thứ tự thực hiện (L: trái sang phải, R: phải sang trái)
Bảng 2 Các toán tử trong Ruby
<< >> 2 L Phép dịch bit (trái, phải)
Trang 9d Các cấu trúc điều khiển
Các cấu trúc điều kiện
IfCấu trúc rẽ nhánh cơ bản nhất trong Ruby
If được khai báo và sử dụng theo cấu trúc sau:
Cấu trúc khai báo:
Trang 10Dạng lệnh rẽ nhánh với cấu trúc đa điều kiện, giúp cho việc rẽ nhiềunhánh một cách dễ dàng trong Ruby.
Cấu trúc lệnh:
case when <> then <>
Trang 11puts "x is 1"
puts "hehe"
when x==2 then puts "x is 2"
when x<3 then "three"
end puts a
Kết quả sẽ là
x is 1hehenil
e Các cấu trúc lặp và liệt kê
Cấu trúc lặp
For
Cấu trúc lặp cơ bản trong Ruby, sử dụng khi biết trước số lần lặp
Cấu trúc khai báo và sử dụng:
for <<variables>> in <<collection>> do
End
begin <>
begin <<actions>>
end
Trang 12End util <<conditions>>
f Cấu trúc liệt kê
Với đối tượng số
upto/downto
Sinh ra mảng các số theo thứ tự giảm dần hoặc tăng dần với tham số đầu vào
là giá trị đầu và cuối của dãy
Trang 1382764
134
Reject
Bỏ các giá trị thỏa mãn biểu thức điều kiện ra khỏi một mảng đầu vào
negative = [1,-2,3,4,-9].reject{|s| s>0}
puts negativeResult:
-2-9
Blocks
Trong quá trình sử dụng các cấu trúc liệt kê, chúng ta thường thấy một nhómcác câu lệnh nằm trong cặp ngoặc nhọn hoặc trong long khối begin/end.Người ta gọi đó là block Thông thường block bao giờ cũng được thực hiệnsau lời gọi hàm
Ví dụ:
10.downto(0){|x| print x}
Trang 14Ở đây khối |x| print x được thực hiện sau lời gọi hàm và đó là block Theo
quy ước thì với với block trong phạm vi một dòng ta nên dùng ngoặc nhọn
còn với block có nhiều dòng ta nên sử dụng do end
Chú ý là trong block, giá trị trả về được thông qua câu lệnh next chứ không phải là return (chỉ trả về giá trị cho hàm đóng).
g Ngoại lệ
Ngoại lệ và cách điều khiển ngoại lệ trong Ruby có phần khá giống với Java
với raise ~throw và try-catch~begin-rescue-end.
Bảng 2 Một số ví dụ so sánh giữa Ruby và Java
for(int i=0;i return factorial;
} public static void main(String args[]){
try{
System.out.println(factorialOf(-1));
}catch(Exception ex){System.out.println(ex.toString()); }
}
Wrong argument java.lang.Exception: Wrong argument
h Các từ khóa điều khiển
Ruby cũng cung cấp một số từ khóa hỗ trợ điều khiển cấu trúc chương trình như:return, break, next, redo, retry, throw/catch
i Methods, procs, lamdas và Closures
Methods
Phương thức có cú pháp như sau:
Trang 15Procs và lambdas là hai cách thức để đưa blocks vào trong đối tượng Tùy thuộc
vào cách mà đối tượng được tạo ra ta sẽ có procs haylambdas.
Trang 16Đối với các hàm việc xác định khả năng truy cập được thông qua các từ
khóa public , private, protected giống như Java Tuy nhiên ở Java chúng ta có
Trang 17thêm default và được coi như mặc định trong khai báo còn ở đây public được coi
là mặc định trong khai báo Public cho phép các hàm được truy nhập từ bất kỳ đâu trong khi private chỉ cho các hàm được truy nhập từ các thành phần khác trong lớp
đó và các lớp con của nó, protected giống private chỉ khác ở chỗ các hàm protected có thể được gọi bởi các thực thể của chính lớp đó hoặc với sefl.
class Test
private def myTest()
puts "test"
end protected def proTest()
puts "pro"
end public def testTest()
theTest = Test.new theTest.proTest() end
def testPrivate()
theTest = Test.new theTest.myTest() end
Trang 18k Thừa kế trong Ruby
Là ngôn ngữ hướng đối tượng nên Ruby có đầy đủ các tính chất như tính đa hình,đóng gói… và kế thừa
class Child <>
def printOut
puts "This is Child Class"
end end
Trang 193 Ruby nâng cao
a Hướng đối tượng
Ruby là một ngôn ngữ lập trình thuần hướng đối tượng Mọi thứ trong Ruby đều làObject, từ các class cho đến những thứ cơ bản nhất: strings, number, true và false
Một class bản thân nó là một Object, được kế thừa từ lớp Class
Attributes (Instance variables) của Object là private với các Object khác và không thểtruy cập từ bên ngoài của class Chúng chỉ có sẵn đối với các object mà được kế thừa.Ngoài ra, từ bên ngoài class, có thể truy cập gián tiếp đến các attributes thông qua cácaccessor method và setter method (tương tự các phương thức get và set trong java)
3 level of access at instance method: private, protected, public Các level này không
áp dụng đối với instance và class variables
Inheritance: chỉ hỗ trợ đơn kế thừa, không hỗ trợ đa kế thừa Thay vào đó Ruby đưa
ra khái niệm Mixins.
Overriding: các lớp con có thể thay đổi hành vi của các method đã được định nghĩasẵn ở lớp cha
Overloading: giống nạp chồng toán tử trong C++
Gồm 4 đặc tính cơ bản:
Đóng gói dữ liệu
Tính chất này không cho phép người sử dụng các đối tượng thay đổi trạng thái nộitại của một đối tượng Chỉ có các phương thức nội tại của đối tượng cho phép thayđổi trạng thái của nó Việc cho phép môi trường bên ngoài tác động lên các dữ liệunội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã.Đây là tính chất đảm bảo sự toàn vẹn của đối tượng
Trừu tượng hóa dữ liệu
Đây là khả năng của chương trình bỏ qua hay không chú ý đến một số khía cạnhcủa thông tin mà nó đang trực tiếp làm việc lên, nghĩa là nó có khả năng tập trungvào những cốt lõi cần thiết Mỗi đối tượng phục vụ như là một "động tử" có thểhoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng thái của nó và liênlạc với các đối tượng khác mà không cần cho biết làm cách nào đối tượng tiến
hành được các thao tác Tính chất này thường được gọi là sự trừu tượng của dữ
liệu.
Trang 20Tính trừu tượng còn thể hiện qua việc một đối tượng ban đầu có thể có một số đặcđiểm chung cho nhiều đối tượng khác như là sự mở rộng của nó nhưng bản thânđối tượng ban đầu này có thể không có các biện pháp thi hành Tính trừu tượng
này thường được xác định trong khái niệm gọi là lớp trừu tượng hay lớp cơ sở
trừu tượng.
Tính đa hình
Thể hiện thông qua việc gửi các thông điệp (message) Việc gửi các thông điệp
này có thể so sánh như việc gọi các hàm bên trong của một đối tượng Các phươngthức dùng trả lời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó đượcgửi tới sẽ có phản ứng khác nhau Người lập trình có thể định nghĩa một đặc tính(chẳng hạn thông qua tên của các phương thức) cho một loạt các đối tượng gầnnhau nhưng khi thi hành thì dùng cùng một tên gọi mà sự thi hành của mỗi đốitượng sẽ tự động xảy ra tương ứng theo đặc tính của từng đối tượng mà không bịnhầm lẫn
Tính kế thừa
Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác
đã có thông qua kế thừa Điều này cho phép các đối tượng chia sẻ hay mở rộng cácđặc tính sẵn có mà không phải tiến hành định nghĩa lại Tuy nhiên, không phảingôn ngữ định hướng đối tượng nào cũng có tính chất này
b Cơ sở dữ liệu
Giao tiếp với cơ sở dữ liệu thông qua DBI (database-independent interface
Các script Ruby tương tác với các database thông qua một interface độc lập với cơ sở
dữ liệu được cung cấp bởi Ruby DBI module
DBI tạo ra một lớp trừu tượng hóa giữa code Ruby và database nằm bên dưới Nóđịnh nghĩa một tập các method, các variables và các conventions mà cung cấp mộtconsistence database interface, độc lập với database đang được sử dụng Nhờ vậy, lậptrình viên có thể dễ dàng giao tác với database mà không cần quan tâm đến loạiDBMS nào đang được sử dụng
Hỗ trợ nhiều hệ cơ sở dữ liệu như: SQLLite, MySQL, Oracle, ODBC…
Trang 21c Ứng dụng Web
Sử dụng thư viện cgi có sẵn để tạo ứng dụng web
Ngoài ra, có thể sử dụng Ruby Embedded (nhúng code Ruby vào trang HTML)
f Web Service
Sử dụng giao thức SOAP, không phụ thuộc vào RPC dựa trên XML, HTTP
Sử dụng giao thức SOAP (Simple Object Acces Protocol)
Trên Ruby, bản cài đặt SOAP có tên SOAP4R
SOAP4R hỗ trợ 2 loại SOAP server applications:
- CGI/FastCGI based (SOAP::RPC::CGIStub)
Tk là chuẩn giao diện đồ họa của Ruby
Tk cho phép tạo GUI độc lập với platform Tk chạy trên Windows, Mac, Linux, vàtrên mỗi hệ điều hành này, GUI được tạo ra sẽ có giao diện giống nhau
Ứng dụng Tk là một hệ thống phân cấp các widget Widget là component cơ bảnnhất, bất kỳ widget nào cũng được đặt trong 1 widget khác và bản thân nó cũng chứacác widget khác Widget chính trong Tk là widget root, được tạo ra bằng cách tạo mộtinstance từ TkRoot
Trang 22Thành phần cơ bản của Tk là widget và nó được gọi từ một cửa sổ, đôi khi của sổ vàwidget có thể sử dụng thay thế cho nhau.
Ruby có thể tiến hành chạy đồng thời nhiều luồng khác nhau trong cùng một thờiđiểm một cách dễ dàng
Giúp tối ưu CPU trong quá trình xử lý các dữ liệu song song một cách gọn nhẹ vàhiệu quả
4 Framework trên Ruby
Một số framework trên Ruby:
Là một trong những framework có quy mô trung bình
Là sự phát triển logic từ Sinatra, về bản chất nó chính là Sinatra
Điểm đặc trưng hữu ích nhất trong thiết kế là khả năng “bao” một ứng dụng bêntrong một ứng dụng khác Khả năng này cho phép chúng ta có thể xây dựng nhữngứng dụng con riêng biệt chứa các hàm chức năng miền đặc trưng
Trang 23Padrino cũng đưa ra mailer, caching, và dịch vụ logging, cũng như là form, tag,asset.
Định tuyến được tạo một cách đơn giản trong Padrino, ta có thể định nghĩa một tệpcontroller bất kỳ trong khi hệ nó đang được truy cập bởi hệ thống
Rails
Rails là một framework ứng dụng web bao gồm tất cả mọi thứ cần thiết để tạo racác ứng dụng web cơ sở dữ liệu được hỗ trợ theo các mô hình Model- View-Controller (MVC)
Rails hỗ trợ tự động sinh code theo một bộ khung được định nghĩa sẵn giúp chúng
ta tiết kiệm thời gian và code nhanh hơn
Một số website sử dụng Rails
- https://github.com/ : Hệ thống quản lý source phân tán, được nhiều công ty lớn
sử dụng, và có hơn 1,5 triệu người đang sử dụng trang web này như một nơilưu trữ các dự án của họ
- http://basecamp.com/ : website quản lý dự án online, ra đời vào năm 2004, chođến nay đã có hơn 8 triệu dự án được quản lý trên website này
- http://twitter.com/: là trang mạng xã hội lớn thứ 2 sau facebook, rất được sửdụng phổ biến tại Mĩ và các nước châu Âu
- http://www.scribd.com/: đây là trang web chia sẻ tài liệu trực tuyến lớn và nổitiếng, có rất nhiều tài liệu hay và miễn phí được chia sẻ tại đây
Và một số website khác cũng nổi tiếng như http://hulu.com, hayhttp://slideshare.com, và nhiều trang web khác
Ngoài ra, còn nhiều framework khác hỗ trợ cho Ruby như Camping, Cramp, Cuba,Salad …
5 Ruby vs C và 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ẽ
Biểu diễn số thực dấu phảy động theo quy tắc dùng kí số 0 hay chuyển đổitường minh
Thiếu một kiểu dữ liệu ký tự