Phương thức 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 12 trên 57.
Một phương thức của lớp thuộc về lớp, không thuộc về một instance cụ thể. Trong phần thân lớp, self là lớp, vì vậy def self.name định nghĩa một phương thức trên lớp. Bạn gọi phương thức đó trực tiếp trên lớp:
class Temperature
def self.to_fahrenheit(celsius)
celsius * 9 / 5.0 + 32
end
end
puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)Đầu ra:
212.0
-40.0Phương thức lớp và phương thức thực thể nằm ở những nơi khác nhau. Một thực thể không thể gọi trực tiếp phương thức lớp; nó gọi phương thức đó thông qua self.class hoặc tên lớp:
class Circle
def self.area_for(r)
(3.14159 * r * r).round(2)
end
def initialize(r)
@r = r
end
def area
self.class.area_for(@r)
end
end
puts Circle.area_for(1)
puts Circle.new(2).area
begin
Circle.new(2).area_for(2)
rescue NoMethodError => e
puts e.message
endĐầu ra:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << self mở một phần trong thân lớp, nơi mỗi def đều là một phương thức lớp. Cách này giúp bạn không phải viết self. khi lớp có nhiều phương thức như vậy:
class Units
class << self
def km_to_miles(km)
(km * 0.621371).round(1)
end
def miles_to_km(miles)
(miles / 0.621371).round(1)
end
end
end
puts Units.km_to_miles(10)
puts Units.miles_to_km(26.2)Đầu ra:
6.2
42.2Dùng phương thức lớp cho công việc thuộc về một loại đối tượng, thay vì một đối tượng cụ thể: chuyển đổi đơn vị, phân tích văn bản thành đối tượng hoặc đếm tổng số instance. Công việc cần dữ liệu của một đối tượng thì dùng phương thức instance:
class Invoice
def self.tax_rate # giống nhau cho mọi hóa đơn
0.2
end
def tax # cần số tiền của hóa đơn này
@amount * Invoice.tax_rate
end
endThử thách
DễHoàn thiện các phương thức của lớp Temperature. to_fahrenheit(c) và to_celsius(f) chuyển đổi một giá trị. feel(celsius) trả về freezing khi giá trị dưới 0, cold khi giá trị dưới 15, mild khi giá trị dưới 25 và hot trong các trường hợp còn lại. convert(text) nhận văn bản như 20 C hoặc 68 F và trả về 20.0 C = 68.0 F (mild) hoặc 68.0 F = 20.0 C (mild), với một chữ số thập phân và cảm giác tương ứng với giá trị Celsius; phương thức này sử dụng các phương thức khác của lớp.
Code được cung cấp gọi Temperature.convert(line) cho mỗi dòng đầu vào và in ra kết quả. Không có đối tượng nào của Temperature được tạo.
Code của bạn nằm trong temperature.rb. main.rb chứa code đầu vào và đầu ra được cung cấp, bạn không thể chỉnh sửa tệp này.
Tự làm thử
require_relative 'temperature'
# Đoạn code đầu vào/đầu ra đã có sẵn: bạn giữ nguyên nhé
input = []
while (line = gets)
input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
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ệ3Phương thức và biến của lớp
Phương thức lớpBiến thực thể của lớpHằng sốPhương thức tạo đối tượngÔn tập: mã giảm giáTự luyện tập: Trình biên dịch Ruby online