Bốn mươi là tuổi già của lớp trẻ; năm mươi là tuổi trẻ của lớp già. Forty is the old age of youth; fifty the youth of old age.
Victor Hugo
1. Điều đầu tiên bạn cần biết.
- Mọi thứ trong ruby đều là object:
Kể cả việc khai báo class thì class vừa được khai báo cũng là một object.
class Something
end
Khi khai báo class như trên nghĩa là bạn đã khai báo một object Something của lớp Class:
Something = Class.new
- Khái niệm Class variable là biến của lớp (chính xác thì ruby không có khái niệm class variable nhưng để cho hiểu giống với các ngôn ngữ lập trình khác thì nó được xem là class variable như giải thích ở trên)
- Khái niệm Instance variable (Object variable) là biến của thực thể (đối tượng)
Và:
@ là tiền tố của instance variable, @@ là tiền tố của class variable
2. Một số chú ý khi sử dụng @ và @@
- Mỗi một object đều có các instance variable riêng.
class Something
@b = 10
end
Something.instance_variable_get(:@b) # => 10
s = Something.new
s.instance_variable_get(:@b) #=> nil
Đoạn code trên tạo ra 2 object: Something là object của lớp Class, và s là object của lớp Something. Vì mỗi object đều có tập các instance variables riêng nên biến @b chỉ thuộc về object Something, còn object s không được khởi tạo biến @b nên mới cho ra kết quả nil như trên.
Lưu ý: Câu lệnh Something.b sẽ không chạy vì @b là instance variable chứ không phải là class variable
Đoạn code sau cho ra kết quả tương tự vì giải thích ở trên:
class Something
@b = 10
def screen
puts @b
end
end
s = Something.new
s.screen #=> nil
- class method (phương thức của lớp) có thể truy cập được instance variable
class Something
@b = 10
def self.print_b
@c = 15
puts @b
end
def self.print_c
puts @c
end
end
Something.print_b #=> 10
Something.print_c #=> 15
Lưu ý: phương thức self.method để khai báo phương thức của class
Các hàm self.print_b và self.print_c có thể in ra được @b và @c là vì hàm self.method là hàm của object Something, nên nó có thể truy cập được các biến @b và @c của object Something.
- @@ là biến của lớp và được dùng chung cho cả các subclasses
class Vars
@class_ins_var = 10 #class instance variable
@@class_var = 15 #class variable
def self.class_method
puts @class_ins_var
puts @@class_var
end
def instance_method
puts @class_ins_var
puts @@class_var
end
end
Vars.class_method #=> 10, 15
obj = Vars.new
obj.instance_method #=> 15
class VarsChild < Vars
end
VarsChild.class_method #=> 15
Link tham khảo:
https://stackoverflow.com/questions/9311347/using-instance-variables-in-class-methods-ruby
https://stackoverflow.com/questions/15773552/ruby-class-instance-variable-vs-class-variable
