Các câu trả lời đúng một phần vì @@ thực sự là một biến lớp theo phân cấp lớp có nghĩa là nó được chia sẻ bởi một lớp, các thể hiện của nó và các lớp con cháu của nó và các thể hiện của chúng.
class Person
@@people = []
def initialize
@@people << self
end
def self.people
@@people
end
end
class Student < Person
end
class Graduate < Student
end
Person.new
Student.new
puts Graduate.people
Điều này sẽ xuất
#<Person:0x007fa70fa24870>
#<Student:0x007fa70fa24848>
Vì vậy, chỉ có một biến @@ giống nhau cho các lớp Person, Student và Grad và tất cả các phương thức lớp và thể hiện của các lớp này đều tham chiếu đến cùng một biến.
Có một cách khác để định nghĩa một biến lớp được định nghĩa trên một đối tượng lớp (Hãy nhớ rằng mỗi lớp thực sự là một thể hiện của một cái gì đó thực sự là lớp Class nhưng nó là một câu chuyện khác). Bạn sử dụng ký hiệu @ thay vì @@ nhưng bạn không thể truy cập các biến này từ các phương thức thể hiện. Bạn cần phải có các hàm bao phương thức lớp.
class Person
def initialize
self.class.add_person self
end
def self.people
@people
end
def self.add_person instance
@people ||= []
@people << instance
end
end
class Student < Person
end
class Graduate < Student
end
Person.new
Person.new
Student.new
Student.new
Graduate.new
Graduate.new
puts Student.people.join(",")
puts Person.people.join(",")
puts Graduate.people.join(",")
Ở đây, @people là một đơn cho mỗi lớp thay vì phân cấp lớp vì nó thực sự là một biến được lưu trữ trên mỗi thể hiện của lớp. Đây là đầu ra:
#<Student:0x007f8e9d2267e8>,#<Student:0x007f8e9d21ff38>
#<Person:0x007f8e9d226158>,#<Person:0x007f8e9d226608>
#<Graduate:0x007f8e9d21fec0>,#<Graduate:0x007f8e9d21fdf8>
Một điểm khác biệt quan trọng là, bạn không thể truy cập trực tiếp các biến lớp này (hoặc biến đối tượng lớp mà bạn có thể nói) từ các phương thức cá thể vì @people trong một phương thức cá thể sẽ tham chiếu đến một biến thể hiện của cá thể cụ thể đó của các lớp Person hoặc Student hoặc Grad .
Vì vậy, trong khi các câu trả lời khác nói chính xác rằng @myvariable (với ký hiệu @ duy nhất) luôn là một biến thể hiện, thì điều đó không nhất thiết có nghĩa là nó không phải là một biến được chia sẻ duy nhất cho tất cả các phiên bản của lớp đó.