Phương thức trong Ruby
Phương thức (hàm) là một khối lệnh thực hiện một chức năng nào đó, tạo hàm để sử dụng lại mã.
Để khai báo hàm dùng từ khóa def
, chỉ ra tên phương thức (nhớ tên bắt đầu
bằng ký tự thường để khỏi xung đột với hằng), viết nội dung
thân phương thức và kết thúc bằng end
. Để gọi hàm chỉ cần viết tên hàm, tất nhiên muốn gọi bao nhiêu lần cũng được.
Ví dụ khai báo hàm tên xinchao
def xinchao puts "Xin chào" end xinchao # gọi phương thức 3 lần xinchao xinchao # In ra: # Xin chào # Xin chào # Xin chào
Tham số của phương thức
Khai báo phương thức có tham số
Bạn có thể khai báo phương thức có tham số (số lượng không hạn chế), tham số khai báo sau tên phương thức,
các tham số cách nhau bởi dấu ,
def tinhtong(a, b) puts a + b end tinhtong(1,10) # In ra 11
Tham số mặc định
Bạn có thể ấn định tham số nhận các giá trị mặc định nếu khi gọi phương thức mà bỏ qua truyền giá trị cho tham số đó.
def tinhtong(a, b = 1) puts a + b end tinhtong(1) # In ra 2
Phương thức trên khai báo có tham số thứ 2 (b) nhận giá trị mặc định, nên khi gọi hàm nếu không truyền giá trị cho tham số này nó tự động dùng giá trị mặc định cho tham số b
Ngoài ra bạn cũng có thể bỏ qua ()
trong khai báo và gọi phương thức
def tinhtong a, b = 5 puts a + b end tinhtong 2, 10 # 12
Tham số tùy chọn của phương thức
Bạn có thể dùng ký hiệu *
để khai báo tham số tùy chọn, khi gọi hàm bạn điền bao nhiêu
giá trị cũng được, các giá trị này tập hợp lại thành mảng và đưa vào phương thức
def sum *num s = 0; num.each {|v| s+=v} puts s end sum(1,2,3) # tryền vào mảng 3 phần tử sum(100) # truyền vào mảng 1 phần tử
Nếu có cả các tham số thông thường, thì tham số tùy chọn cần đặt ở cuối cùng
def mymethod(a, b, *c) # code here end
Giá trị trả về của phương thức
Các phương thức luôn có giá trị trả về, nếu muốn ấn định một giá trị trả về thì dùng lệnh return, sau return là một giá trị, đối tượng hay biểu thức. Trong một phương thức nếu không có lệnh return thì mặc định giá trị dòng code cuối cùng trả về
Lưu ý là trong thân phương thức, khi gặp return thì các đoạn code sau nó không được thực thi. Nói cách khác gặp return phương thức kết thúc ngay lập tức
def sum *num s = 0; num.each {|v| s+=v} return s end kq = sum(1,2,3) puts kq
Phạm vi của biến
Trong Ruby có 4 loại phạm vi: biến cục bộ (local), biến toán cục (global), trong instance và trong class
Biến cục bộ
Nó chỉ có hiệu lực trong khu vực nó khai báo, ngoài khu vực nó khai báo không còn hiệu lục. Ví dụ trong hàm, trong vòng lặp, trong khối lệnh
s = 1000 def sum *num s = 0; # biến s khai báo trong hàm, nó chỉ có hiệu lực trong hàm, # nó khác với các biến ngoài hàm num.each {|v| s+=v} # biến v cục bộ trong vòng lặp return s end kq = sum(1,2,3) puts s # in ra 1000, biến s này độc lập với s trong hàm
Khai báo biến toàn cục
Biến toàn cục có thể truy cập bất kỳ đầu của chương trình, giống nhau dù trong hàm, lớp - để khai
báo biến toàn cục dùng ký hiệu $
$x = 42 # $x là biến toàn cục def change $x = 8 $ truy cập biến toàn cục từ hàm end change puts $x # outputs 8
Loại phạm vi class và instance tìm hiểu ở các phần sau
Đệ quy
Một cách khác để tạo ra vòng lặp đó là xây dựng các hàm đệ quy. Đệ quy là một ham trong thân của nó có gọi đến chính nó. Ví dụ như hàm tính giai thừa bằng đệ quy:
Ví dụ giai thưa của 5:
5! = 5 * 4 * 3 * 2 * 1 (120)
Ta thấy 5! = 5 * 4!; 4! = 4 * 3!; 3! = 3 * 2! ... vậy thấy quy luật là
n! = n * (n-1)!, quy luật này đúng khí n!=1
được gọi là trường hợp cơ sở.
Từ đó xây dựng được phương thức
def giaithua(n) if n<= 1 return 1 # dừng đệ quy else return n * giaithua( n - 1 ) # gọi đệ quy end end puts giaithua(5) # 120