Article:
Class, instance, method, attribute trong Ruby
965
trangia61.myopenid.com 3Updated about 1 year ago |
Trong Ruby có các khái niệm về class method, class variable, instance method và instance variable. Phân biệt và hiểu rõ chúng sẽ giúp ta học Ruby hiệu quả hơn.
1. Có 2 loại class variable. Nếu trong class A không có instance method (chỉ có class method) thì @@class_var, @class_me_var_1, @class_me_var_2... có ý nghĩa và scope giống nhau: trong cả class.
class A
@@class_var = 0
def self.class_method1(x)
@class_me_var_1 = x
end
def self.class_method2
puts @class_me_var_1
puts @@class_var
end
end
# Test run
A.class_method1(100)
A.class_method2 # Hiện ra 100 và 0
Ta thấy class A có 3 class variable, từ class method nào cũng truy cập được.
Chú ý Ruby là ngôn ngữ động, cần phân biệt 2 khái niệm độc lập là scope tồn tại và chỗ xuất hiện lần đầu tiên của biến:
- Biến xuất hiện khi truy cập lần đầu tiên (đừng nghĩ đây là khai báo biến giống như trong các ngôn ngữ định kiểu tĩnh như Java).
- Sau khi xuất hiện, scope tồn tại của nó phụ thuộc vào loại biến.
Ví dụ @class_me_var_1 không phải là biến chỉ có tác dụng bên trong một mình A.class_method1.
2. class A có cả instance method và class method: (xem kèm sơ đồ hình vẽ)
class A
@@class_var1 = 0
def self.class_method_set(x)
@class_var2 = x
end
def self.class_method_get
puts @@class_var1
puts @class_var2
puts @instance_var
end
def instance_method_set(y)
@instance_var = y
end
def instance_method_get
puts @@class_var1
puts @class_var2
puts @instance_var
end
end
# Run test
#-------- set --------
A.class_method_set(1)
instance1 = A.new
instance2 = A.new
instance1.instance_method_set(70)
instance2.instance_method_set(80)
#-------- get --------
A.class_method_get
instance1.instance_method_get
instance2.instance_method_get
# Result
# A.class_method_get
0 (->1 trong so do)
1 (->2 trong so do)
nil
# instance1.instance_method_get
0 (->4 trong so do)
nil
70 (->3 trong so do)
# instance2.instance_method_get
0 (->4 trong so do)
nil
80 (->3 trong so do)
* Sơ đồ scope của biến và giới hạn truy cập biến của method:

- Phạm vi tồn tại của biến có @ hay @@ phía trước (vd: @@class_var1, @class_var2, @instance_var) là nằm ngoài method (class hay instance).
- Có 3 loại truy cập biến của method:
- Trong cùng class: class_method có thể truy cập class variable: ->1 và ->2
- Trong cùng instance: ->3
- Giữa class và instance: instance_method có thể truy cập biến @@class_var1 (->4), không thể truy cập biến @class_var2. Với chiều ngược lại, class_method không thể truy cập biến @instance_var.
3