Menu
CoddyTech

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.0

Phươ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 Circle

class << 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.2

Dù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
end
challenge icon

Thử 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) }
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Ruby online