Định nghĩa lớp
Thuộc phần Lập trình hướng đối tượng trong hành trình Ruby của Coddy. Bài học 2 trên 57.
Một lớp mô tả một loại đối tượng: nó biết gì và có thể làm gì. class Dog ... end khai báo lớp, còn Dog.new tạo một đối tượng thuộc lớp đó, gọi là một instance. Bạn có thể gọi phương thức được định nghĩa bằng def bên trong lớp trên mọi instance:
class Dog
def speak
"Woof"
end
end
rex = Dog.new
puts rex.speak
puts rex.classĐầu ra:
Woof
Dognew tạo đối tượng rồi gọi phương thức initialize với các đối số bạn truyền cho new. initialize thiết lập đối tượng, thường bằng cách lưu các đối số vào biến thực thể, có tên bắt đầu bằng @:
class Dog
def initialize(name)
@name = name
end
def speak
"#{@name} says Woof"
end
end
puts Dog.new("Rex").speak
puts Dog.new("Bella").speakĐầu ra:
Rex says Woof
Bella says WoofCác phương thức nhận đối số như mọi phương thức Ruby khác và trả về giá trị của biểu thức cuối cùng. Mỗi lần gọi new sẽ tạo một đối tượng riêng:
class Calculator
def add(a, b)
a + b
end
def average(numbers)
numbers.sum.to_f / numbers.size
end
end
calc = Calculator.new
puts calc.add(2, 3)
puts calc.average([1, 2, 3, 6])Đầu ra:
5
3.0Tên lớp là các hằng số được viết theo kiểu CamelCase (BankAccount); tên phương thức và biến dùng snake_case (deposit_money). new kiểm tra các đối số dựa trên initialize, vì vậy thiếu đối số sẽ gây ra ArgumentError:
class Point
def initialize(x, y)
@x = x
@y = y
end
end
begin
Point.new(1)
rescue ArgumentError => e
puts e.message
endĐầu ra:
wrong number of arguments (given 1, expected 2)Thử thách
DễHoàn thiện lớp Formatter. Phương thức title(text) trả về văn bản với mỗi từ được viết hoa chữ cái đầu (the hobbit cho kết quả The Hobbit), slug(text) trả về các từ ở dạng chữ thường, nối với nhau bằng - (the-hobbit), còn initials(text) trả về chữ cái đầu tiên của mỗi từ ở dạng chữ hoa (TH).
Code được cung cấp tạo một đối tượng Formatter và, với mỗi dòng đầu vào, in ba kết quả trên các dòng riêng biệt.
Code của bạn nằm trong formatter.rb. main.rb chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
require_relative 'formatter'
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input = []
while (line = gets)
input << line.chomp
end
formatter = Formatter.new
input.each do |line|
puts formatter.title(line)
puts formatter.slug(line)
puts formatter.initials(line)
end
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpBiến instancePhương thức và selfto_s và inspectÔn tập: thẻ thư viện4Tính đóng gói
Phương thức riêng tưPhương thức được bảo vệPhương thức thiết lập riêng tưBảo vệ trạng tháiÔn tập: máy bán hàng tự động7Tính đa hình và duck typing
Tính đa hìnhDuck typingPhương thức trừu tượngcase và lớpÔn tập: phương thức thanh toán2Phương thức truy cập và self
Phương thức đọc và ghiPhương thức gán tùy chỉnhself trong phương thứcĐịnh danh và tính bằng nhauÔn tập: Danh sách liên hệTự luyện tập: Trình biên dịch Ruby online