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,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/13706373/what-does-def-self-function-name-mean?answertab=votes#tab-top

https://stackoverflow.com/questions/19269119/ruby-why-is-an-instance-variable-defined-inside-a-class-nil

https://stackoverflow.com/questions/9311347/using-instance-variables-in-class-methods-ruby

https://stackoverflow.com/questions/15773552/ruby-class-instance-variable-vs-class-variable