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 WoofCá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 2Bạ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 DogBiế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]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
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