Hash, Symbol, Iterator (Bài trước)
(Bài tiếp) Lớp trong Ruby

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

Đăng ký theo dõi ủng hộ kênh
Hash, Symbol, Iterator (Bài trước)
(Bài tiếp) Lớp trong Ruby