Tải bản đầy đủ (.doc) (27 trang)

Các vấn đề hiện đại Công nghệ phần mềm: Báo cáo Ruby On Rails

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (318.67 KB, 27 trang )


1 | P a g e
TRƯỜ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
Hà Nội, tháng 12 năm 2013
MỤC LỤC
MỤC LỤC 1
LỜ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 6
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 13
k. Thừa kế trong Ruby 17
3. Ruby nâng cao 18


a. Hướng đối tượng 18
b. Cơ sở dữ liệu 19
c. Ứng dụng Web 20
d. Gửi Email 20
e. Lập trình Socket 20
f. Web Service 20
g. Ruby/Tk 20
h. Ruby/LDAP 21
1 | P a g e
Tổng quan về Ruby – CVĐHĐ CNPM
i. Đa luồng 21
4. Framework trên Ruby 21
5. Ruby vs C và Perl 22
III. Cài đặt chương trình 23
1. Cài đặt Ruby 23
2. Demo ví dụ Ruby 24
Tổng Kết 25
Tài liệu tham khảo 25
Page | 2
Tổng quan về Ruby – CVĐHĐ CNPM
LỜ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áo
nà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ác
mô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 ý cho
chú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!
Page | 3
Tổng quan về Ruby – CVĐHĐ CNPM
NỘI DUNG
I. Phân công công việc
Bảng1: bảng phân công công việc
Công việc Phan Duy Toàn Nguyễn Văn Nội
• Tìm hiểu chung về Ruby
• So sánh, và ưu-nhược điểm
• Ruby advances
• Demo
x
x
x
x
x
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 đố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, 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: 3
rd
Generation Language), một
trươ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 theo
khối (code block). Bên cạnh đó với đặc điểm là ngôn ngữ thông dịch được viết theo
dạng script, chương trình không cần hàm main mà được thực thi theo thứ tự các dòng
mã.
Page | 4
Tổng quan về Ruby – CVĐHĐ CNPM
Mộ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ầu
xá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ết
xuố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ện
thị 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
Page | 5
Tổng quan về Ruby – CVĐHĐ CNPM
Sẽ 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.new
Cá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 đặc
biệ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ềm
dẻ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ích
xuất subArr = arr[0,2] #subArr = [[1,2],[3,4,5,6]]. Các mảng có thể tương tác với

nhau thông qua các toán tử như +,-,*…
Với phép + ta có thể cộng hai mảng với nhau:
ar= [1,2,3] +[4] # ar=[1,2,3,4]
Với phép trừ các phần tử mảng ở mảng trừ sẽ loại bỏ các phần tử có trong mảng
bị trừ.
ar= [1,2,3] -[2] # ar=[1,3]
Với phép nhân, ta có thể nhân một mảng với một số và kết quả cho ta số phần tử
mảng được lặp lại theo giá trị được nhân:
ar= [1,2,3]*2 # ar= [1,2,3,1,2,3]
Các mảng có thể đính thêm phần tử với phép toán <<:
ar= [1,2,3]<<4 # ar= [1,2,3,4]
Và các phép so sánh: |, &. Với | các giá trị trùng lặp của hai mảng sẽ được bỏ đi (
kể cả các phần tử trùng lặp trong 1 mảng. ar = [1,2,2,4,3,4] | [] # ar[1,2,4,3].
Trong khi đó với phép toán & các phần tử trùng nhau được giữ lại ( và không
lặp). ar = [1,2,2,4,3,4] & [4,4] # ar[4]
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
Page | 6
Tổng quan về Ruby – CVĐHĐ CNPM
N: 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
Toán tử N A Ghi chú
! ~ + 1 R
Toán tử phủ định, bù bit,
phép cộng một toán hạng
** 2 R Phép lũy thừa
- 1 R Phép trừ một toán hạng
* / % 2 L Phép nhân, chia, lấy số dư
+ - 2 L

Phép cộng, trừ ( hai toán
hạng)
<< >> 2 L Phép dịch bit (trái, phải)
& 2 L Phép AND các bit
| ^ 2 L Phép OR và XOR các bit
< <= >= > 2 L
So sánh hơn kém (hoặc
bằng)
== === != =~ !~ <=> 2 N
So sánh bằng, so sánh
kiểu case, so sánh khác,
hợp mẫu, so sánh
&& 2 L Phép AND logic
|| 2 L Phép OR logic
2 N Dải giá trị và flip-flop
?: 3 R Điều kiện
Rescue 2 L Bổ nghĩa ngoại lệ
Page | 7
Tổng quan về Ruby – CVĐHĐ CNPM
Toán tử N A Ghi chú
=**= *= /= %= += -=
<<= >>=
&&= &= ||= |= ^=
2 R Phép gán
Not 1 R
Phép phủ định logic ( ưu
tiên thấp)
and or 2 L
Phép AND, OR logic (ưu
tiên thấp)

d. Các cấu trúc điều khiển
• Các cấu trúc điều kiện
 If
Cấ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:
if <<điều kiện>>
<>
end
<>
if <<điều kiện>>
 if-else
Dạng đầy đủ của cấu trúc rẽ nhánh if, nó giúp kiểm soát rẽ nhánh chặt chẽ
hơn cả trường hợp đúng và sai của biểu thức điều kiện.
Cấu trúc khai báo:
if <<điều kiện>>
<>
else
<>
end
 elsif
Page | 8
Tổng quan về Ruby – CVĐHĐ CNPM
Dạng lệnh rẽ nhánh với cấu trúc đa điều kiện, giúp cho việc rẽ nhiều
nhánh một cách dễ dàng trong Ruby.
Cấu trúc lệnh:
if <<điều kiện>>
<>
elsif<<điều kiện>>
<>
elsif<<điều kiện>>

<>
end
 unless
Cấu trúc rẽ nhánh với điều kiện xét ngược lại so với if, nó sử dụng tương
tụ như if.
Cấu trúc lệnh:
unless <<điều kiện>>
<>
end
unless cũng có thể được sử dụng với else như trường hợp của if.
 case
Case trong Ruby không giống trong Java, nó không cần lệnh break để
nháy khỏi mỗi trường hợp điều kiện riêng. Ở đây có thể sử dụng cấu trúc
elseif để đưa ra khối điều khiển giống như trong khối điều khiển case, tuy
nhiên cú pháp case vấn thường được sử dụng nhiều hơn.
Cấu trúc lệnh:
case
when <> then <>
end
Chú ý là ở đây nếu có nhiều hơn một điều kiện đúng thì hành động của
điều kiện đầu tiên sẽ được thực hiện
Ví dụ:
x=1
a=case
when x>0 then
Page | 9
Tổng quan về Ruby – CVĐHĐ CNPM
puts "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 1
hehe
nil
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
<<actions>>
end
 While
Cấu trúc lặp cơ bản dùng cho trường hợp lặp khi không biết trước số lần lặp
trong Ruby.
Cấu trúc khai báo cũng giống như trong Java hay C.
while <> do
<>
End
begin
<>
while <>
 Util
Cấu trúc lặp nâng cao của Ruby, cách thức thực hiện tương tự như while.
Cấu trúc lệnh:
util <<condition>> do
<<actions>>

begin
<<actions>>
end
Page | 10
Tổng quan về Ruby – CVĐHĐ CNPM
End 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.
0.upto(9){|s| print s}
Result: 023456789
 Times
Sinh ra mảng dãy số theo thứ tự tăng dần với sô bắt đầu là 0, yêu cầu tham số
đầu vào là số chữ số cần in ra.
10.times{|s| print s}
Result: 0123456789
 Step
Tạo ra mảng dãy số tăng dần với tham số đầu vào là chỉ số đầu – cuối và bước
nhảy được người dùng định nghĩa.
0.step(9,1){|x| print x}
Result: 0123456789
 Each
Tạo ra mảng các sô tăng dần theo giá trị đầu cuối là tham số truyền vào.
(1 9).each{|s| print s}
Result: 123456789
 Collect
Tương tự Each nhưng có thể tiến hành tính toán và thao tác trên biến sô trước
khi gán vào mảng.

result = (2 4).collect{|s| s*s*s}
puts result
Page | 11
Tổng quan về Ruby – CVĐHĐ CNPM
Result:
8
27
64
 Select
Chọn các số trong một mảng theo điều kiện và sắp xếp các giá trị được chọn
thành một mảng.
positive = [1,-2,3,4,-9].select{|s| s>0}
puts positive
Result:
1
3
4
 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 negative
Result:
-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óm
cá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ện
sau lời gọi hàm
Ví dụ:

10.downto(0){|x| print x}
Page | 12
Tổng quan về Ruby – CVĐHĐ CNPM
Ở đâ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
Ruby Java
def factorialOf(n)
raise ArgumentError,"Wrong
argument" if n <0
factorial =1
1.upto(n){|x| factorial*=x}
return factorial
end
begin
factorialOf(-1)
rescueArgumentError=>ex
puts ex.message
end
public static long factorialOf(int n)throws Exception{
if(n<0)>throw new Exception("Wrong argument");
long factorial=1;
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());
}
}
Ruby Java
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:
Page | 13
Tổng quan về Ruby – CVĐHĐ CNPM
def <> (<>)
Ví dụ:
def squareRootOf(n,loop)
ini = n/2
loop.times {ini = (n/ini + ini)/2}
return ini
end
Một điểm đặc biệt ở đây là nhiều giá trị có thể đồng thời được trả về trong một
phương thức. Các giá trị trả về sẽ được tập hợp trong một mảng.
Ví dụ:
def multiValuesReturn()
return 1, 'hello', 1.4
end

arr = multiValuesReturn
arr.each {|x| print x}
• Procs và lambdas
Procs 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.
Tạo procs
def createProcs(&p)
p
end
exp = createProcs{|x,y| x**y}
Hoặc
exp = Proc.new{|x,y| x**y}
Gọi procs
puts exp.call(2,3)
Tạo lambdas
incre = lambda{|x| x+1}
hoặc
incre= ->(x){x+1} # ruby version 1.9
Page | 14
Tổng quan về Ruby – CVĐHĐ CNPM
hoặc
incre=->(x;step=2){x+step} # Một tham số x và biến nội bộ step
Gọi lambdas
puts incre.call(2)
• Closures
Closures là một khái niệm chỉ một hàm sử dụng một biến giới hạn. Thông thường
closures dùng để nói đến hàm lồng. Ở đó hàm bên trong sử dụng biến được khai
báo bởi hàm chứa nó. Ở Ruby, khái niệm này thường được thể hiện bởi các khối
lambdas hoặc procs.
Ví dụ:

def mainFunction(n,m)
lambda{|x| x*n/m}
end
myLambda = mainFunction(2,4)
puts myLambda.call(2)
Kết quả 1
j. Lớp và Modules
• Lớp
Là một ngôn ngữ hướng đối tượng, khái niệm lớp là thành phần cơ bản trong
Ruby. Lớp được khai báo như sau:
class <<name_of_class>>
<<body_of_class>>
end
Khới tạo class:
<<name_of_class>>.new
Hàm khởi tạo trong lớp. ( giống như hàm tạo và khởi tạo giá trị trong java)
def initialize(<<var1>>,<<var2>>)
<<khới tạo các giá trị>>
end
Đố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ó
Page | 15
Tổng quan về Ruby – CVĐHĐ CNPM
thê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
end
a = Test.new
a.testTest()# =>pro
a.testPrivate()#=> error in red as below
Kết quả: pro
Bên cạnh đó ở Ruby các biến trong lớp đều được đặt là private, trong khi các hằng
số đều là public.
• Modules
Modules là nhóm các thành phần hàm, biến, hằng số và chạy độc lập
module MyModule
def MyModule.intro
puts "This is the intro of modul"
end
def MyModule.sayHello
Page | 16
Tổng quan về Ruby – CVĐHĐ CNPM
puts "Hello"

end
end
class MyClass
include(MyModule)
def sayHello
MyModule.sayHello
end
end
myClass = MyClass.new
myClass::sayHello
Một chương trình có thế gồm nhiều file, và với ngôn ngữ script như Ruby thì việc
phân chia chương trình thành các file chứa các module khác nhau.Các file này sau
đó có thể được sử dụng thông qua lời gọirequire hoặc load trong chương trình
chính.
k. 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
Ví dụ:
class Parent
def printOut
puts "This is Parent class"
end
end
class Child <>
def printOut
puts "This is Child Class"
end
end
Page | 17
Tổng quan về Ruby – CVĐHĐ CNPM

3. 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ác
accessor 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ĩa
sẵ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ội
tạ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ệu
nộ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ạnh
củ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 trung
và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ên
lạ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.
Page | 18
Tổng quan về Ruby – CVĐHĐ CNPM
Tí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ương
thứ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 đó được
gử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ần
nhau 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 đối
tượ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ải
ngô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ột
consistence database interface, độc lập với database đang được sử dụng. Nhờ vậy, lập
trình viên có thể dễ dàng giao tác với database mà không cần quan tâm đến loại

DBMS nào đang được sử dụng.
Hỗ trợ nhiều hệ cơ sở dữ liệu như: SQLLite, MySQL, Oracle, ODBC…
Page | 19
Tổng quan về Ruby – CVĐHĐ CNPM
c. Ứ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).
d. Gửi Email
Sử dụng lớp Net::SMTP để giao tiếp giữa client và server.
e. Lập trình Socket
Ruby cung cấp hai mức độ tiếp cận với các dịch vụ mạng . Ở mức độ thấp, bạn có thể
truy cập vào ổ cắm hỗ trợ cơ bản của hệ điều hành cơ bản, cho phép bạn thực hiện các
khách hàng và máy chủ cho cả hai giao thức hướng kết nối và không kết nối.
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)
- Standalone (SOAP::RPC:StandaloneServer)
SOAP::RPC::Driver hỗ trợ cho việc viết ứng dụng SOAP client applications
g. Ruby/Tk
Là một gói công cụ của bên thứ ba, dùng để hỗ trợ cho quá trình tọa lập GUI trên
Ruby.
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ản
nhấ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ứa
các widget khác. Widget chính trong Tk là widget root, được tạo ra bằng cách tạo một

instance từ TkRoot.
Page | 20
Tổng quan về Ruby – CVĐHĐ CNPM
Thà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.
h. Ruby/LDAP
Ruby / LDAP là một thư viện mở rộng cho Ruby. Nó cung cấp giao diện cho một số
thư viện LDAP như OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.
API chung cho phát triển ứng dụng được mô tả trong RFC1823 và được hỗ trợ bởi
Ruby / LDAP.
i. Đa luồng
Ruby có threading độc lập với cả hệ điều hành. Thế nên, tất cả nền tảng khác mà
Ruby chạy trên sẽ có multithreading bất kể hệ đấy có hỗ trợ hay không. Ngay cả
MSDOS còn hỗ trợ.
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:
• Sinatra
Là đại diện điển hình và độc đáo cho thể loại framework siêu nhỏ bé (micro
framework) cho Ruby.
Là một DSL (domain-specific language) dùng để tạo nhanh chóng ứng dụng web
trong Ruby.
Về cơ bản, Sinatra có khả năng lắng nghe và trả lời lời gọi HTTP – đây là chức
năng cơ bản nhất.
• Padrino
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ên
trong 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.
Page | 21
Tổng quan về Ruby – CVĐHĐ CNPM
Padrino 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ệp
controller 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 ra
cá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.
- : 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ơi
lưu trữ các dự án của họ.
- : 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.
- 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
- đây là trang web chia sẻ tài liệu trực tuyến lớn và nổi
tiế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ư , hay
, 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 đổi
tường minh.
• Thiếu một kiểu dữ liệu ký tự.
Page | 22
Tổng quan về Ruby – CVĐHĐ CNPM
III. Cài đặt chương trình
1. Cài đặt Ruby
Bước 1. Tải phiên bản Rub thích hợp trên trang y-
lang.org/en/downloads/ cho Windows.
Hình 1: Trang web chứa phiên bản cài đặt Ruby.
Bước 2. Tiến hành tích vào các lựa chọn cài đặt.
Page | 23
Tổng quan về Ruby – CVĐHĐ CNPM
Hình 2: Cài đặt Ruby trên Window.
Bước 3. Kiểm tra xem phiên bản cài đặt trên màn hình DOS.
Hình 3: Kiểm tra phiên bản Ruby đã được cài đặt trên Window.
2. Demo ví dụ Ruby
• Kế thừa trong Ruby (sử dụng Mixin)
• Ứng dụng sending email.
Page | 24

×