Menu
CoddyTech

Biến instance

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 3 trên 57.

Biến thực thể bắt đầu bằng @ và thuộc về một đối tượng. Giá trị được lưu trong initialize luôn khả dụng với mọi phương thức của đối tượng đó, và mỗi thực thể có bản sao riêng:

class Dog
  def initialize(name)
    @name = name
  end

  def speak
    "#{@name} says Woof"
  end
end

rex = Dog.new("Rex")
bella = Dog.new("Bella")
puts rex.speak
puts bella.speak

Đầu ra:

Rex says Woof
Bella says Woof

Các phương thức có thể thay đổi các biến instance, nên đối tượng ghi nhớ những gì đã xảy ra với nó. Tập hợp các biến instance tạo nên trạng thái của đối tượng:

class Counter
  def initialize
    @count = 0
  end

  def increment
    @count += 1
  end

  def report
    "count is #{@count}"
  end
end

clicks = Counter.new
clicks.increment
clicks.increment
puts clicks.report

Đầu ra:

count is 2

Bạn không thể truy cập biến thực thể (instance variable) từ bên ngoài đối tượng. Code bên ngoài chỉ có thể gọi phương thức, vì vậy lớp muốn chia sẻ một giá trị sẽ định nghĩa một phương thức trả về giá trị đó, gọi là phương thức đọc:

class Dog
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

rex = Dog.new("Rex")
puts rex.name
begin
  rex.age
rescue NoMethodError => e
  puts e.message
end

Đầu ra:

Rex
undefined method `age' for an instance of Dog

Biến thực thể chưa từng được gán sẽ có giá trị nil và không gây ra lỗi, vì vậy tên bị viết sai sẽ âm thầm đọc một biến khác đang trống. instance_variables liệt kê các biến mà đối tượng thực sự có:

class Lamp
  def initialize
    @on = false
  end

  def status
    @onn.inspect
  end
end

lamp = Lamp.new
puts lamp.status
p lamp.instance_variables

Đầu ra:

nil
[:@on]
challenge icon

Thử thách

Dễ

Hoàn thiện lớp Pet. initialize(name, species, age) lưu ba giá trị, birthday tăng tuổi thêm một năm và describe trả về một câu: thú cưng tên Rex, loài dog, tuổi 3 sẽ cho kết quả Rex is a 3 year old dog.

Code được cung cấp tạo một đối tượng Pet từ ba dòng đầu vào đầu tiên (tên, loài, tuổi), gọi birthday số lần theo dòng thứ tư và in ra kết quả của describe.

Code của bạn nằm trong pet.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 'pet'

# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
input = []
while (line = gets)
  input << line.chomp
end
pet = Pet.new(input[0], input[1], input[2].to_i)
input[3].to_i.times { pet.birthday }
puts pet.describe
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