Phân Biệt Biến Có Tiền Tố @ Và @@ Trong Ruby Rails - Blog
Có thể bạn quan tâm
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 endKhi 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, và 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 #=> 15Lư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 #=> 15Link 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
-
Variables & Scope Trong Ruby - Viblo
-
Variable Trong Ruby - Viblo
-
Các Toán Tử Số Học Trong Ruby
-
Lớp Trong Ruby - Lập Trình Hương đối Tượng
-
Variable Trong Ruby - NguyenAnh Blog
-
Các Loại Biến Và Cách Sử Dụng Module Trong Ruby - Freetuts
-
Tìm Hiểu Ruby Trong 25 Phút
-
Biến Trong Ruby - Trang Chủ - .vn
-
Ruby – Biến - Phở Code
-
Sử Dụng (&. ) Trong Ruby | TechHay Blog
-
Khoảng Trắng Trong Ruby
-
Bắt đầu Từ Con Số Không Với Ruby? | TopDev
-
[Ruby] Objects Trong Ruby #1 - Kipalog
-
Tất Tần Tật Về Nil Trong Ruby - Đơn Giản Nhưng Bạn đã Biết Chưa