Đó là một sai lầm phổ biến được thực hiện bởi các lập trình viên Java đến với Ruby là tốt, và một trong những bước nhảy khái niệm lớn tôi đã có để có được đầu của tôi xung quanh. Lúc đầu nó có vẻ kỳ quặc, nhưng nó thực sự là một trong những khía cạnh thú vị của Ruby - tất cả các mã đều có thể thực thi được, bao gồm các định nghĩa lớp.
Vì vậy, các biến mẫu phải được khai báo bên trong các phương thức. Nó phải liên quan đến cách thức 'tự' được đánh giá. 'self' là đối tượng hiện tại. Thông dịch viên sẽ tra cứu các cuộc gọi phương pháp và tài liệu tham khảo biến đầu tiên trong 'tự':
class Fish
@var = "foo" # here 'self' == Fish, the constant which contains the class object
def foo
# do foo
end
end
fish = Fish.new
fish.foo # here 'self' == fish, an instance of Fish
Trong một định nghĩa lớp, 'tự' được đặt là đối tượng lớp được xác định, vì vậy bất kỳ tài liệu tham khảo trong một định nghĩa lớp sẽ tham khảo đối tượng lớp đó, trong trường hợp này là Cá.
Khi phương thức được gọi trên cá thể cá, tuy nhiên, bản thân được đặt làm người nhận cuộc gọi, cá thể cá cụ thể. Vì vậy, bên ngoài định nghĩa phương thức, tự là đối tượng lớp. Bên trong một phương thức, bản thân nó là thể hiện của người nhận. Đây là lý do tại sao @var bên ngoài một định nghĩa phương thức giống như một biến tĩnh trong Java, và @var bên trong một định nghĩa phương thức là một biến cá thể.
Nguồn
2010-01-18 14:57:14
shouldn' đó là một @@ var trong khối mã đầu tiên? – Jean
Tôi đang đọc "Rubyist Grounded" (http://manning.com/black2/) của David Black. Anh ấy làm một công việc tuyệt vời giải thích tất cả các sắc thái trong khu vực này –
Jean: Không. Nếu tôi sử dụng '@@ var' thì các lớp con sẽ ghi đè lên các lớp cha. Xem liên kết của hobodave. Cụ thể như thế nào '2' là overriden trong ví dụ. –