Phân Biệt Biến Có Tiền Tố @ Và @@ Trong Ruby Rails - Blog

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

Từ khóa » Trong Ruby