Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Class, instance, method, attribute trong Ruby 965

trangia61.myopenid.com 3
Updated 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:
  1. Trong cùng class: class_method có thể truy cập class variable: ->1 và ->2
  2. Trong cùng instance: ->3
  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.

Comments

You must login to be able to comment

Uploaded files
Name Size Uploader Time
cimar.jpg 10.9 KB
trangia61.myopenid.com 3
about 1 year ago

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content