IT Staff

Blog về chuyên ngành IT

Class, instance, method, attribute trong Ruby

leave a comment »

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

Ruby
trangia61.myopenid.com 3
Updated over 2 years 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.

Written by Xavier

Tháng Tám 3, 2013 lúc 9:58 sáng

Posted in Ruby

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: