2013-03-12 22 views
5

Tôi không chắc chắn cách này là mã hợp lệ:của Ruby << (tăng gấp đôi ít hơn) với các biến dụ

class Library 
    def initialize(games) 
    @games = games 
    end 

    def add_game(game) 
    games << game 
    end 

    def games() 
    @games 
    end 
end 

games = ['WoW','SC2','D3'] 
lib = Library.new(games) 
puts lib.games 
lib.add_game('Titan') 
puts lib.games 

này sẽ in ra:

WoW SC2 D3 Titan

Tôi nghĩ rằng nó sẽ in ra

WoW SC2 D3

Phương thức add_game không sử dụng biến mẫu. Là người mới đối với Ruby, tôi không hiểu cách làm việc này. không nên nó phải là:

def add_games(game) 
    @games << game 
end 

Tôi đang đọc này từ một hướng dẫn và tôi đã không thể tìm thấy bất cứ điều gì về cách < < công trình đặc biệt với các biến số ví dụ. Tôi nghĩ '< <' vừa bị quá tải khi giao dịch với mảng được 'nối thêm vào mảng'. Điều này thực sự làm một cái gì đó w/Singleton lớp học?

+2

Là một sang một bên, hãy thử thêm một 'đặt games' sau cuối cùng của bạn 'đặt lib.games' và bạn sẽ thấy tại sao' @games = trò chơi' phải là '@games = games.dup'. –

Trả lời

6

Mã này hơi khó hiểu. Dòng:

games << game 

thực sự gọi phương thức games, trả về @games. Sau đó, phương thức << được gọi trên kết quả đó. Có một số đường cú pháp trong trình phân tích cú pháp Ruby biến toán tử << thành một cuộc gọi phương thức trên toán hạng bên trái và toán hạng bên trái đang được đánh giá trước khi điều đó xảy ra.

Chỉnh sửa cho rõ ràng hơn:

Điểm mấu có thể được viết như thế này:

(games).<< game 

hay này:

(self.games).<< game 

hay:

(self.games) << game 

tất cả đều thực hiện phương thức games.

+0

Ah, điều đó có ý nghĩa hơn nhiều Jim. Cảm ơn bạn! – sjmh

+1

Hoặc 'trò chơi() << trò chơi' mà có thể đã được tự tài liệu và có lẽ tránh nhầm lẫn ở nơi đầu tiên. –

+0

mà không có cha mẹ nó là nhiều hơn nữa DSL-ish, và đóng gói-y, IMO. – radarbob

0

Nó sử dụng biến cá thể của lớp, nhìn vào mã của bạn:

class Library 
    def initialize(manygames) 
    @games = manygames 
    end 

    def add_game(game) 
    imlookingforclassinstancevariable << game 
    end 

    def imlookingforclassinstancevariable 
    @games #i'm the final storage of your array 
    end 
end 
games = ['WoW','SC2','D3'] 
lib = Library.new(games) 
puts lib.imlookingforclassinstancevariable 
lib.add_game('Titan') 
puts lib.imlookingforclassinstancevariable 
+0

Tại sao "biến thể hiện lớp" thay vì chỉ "biến mẫu"? – hdgarrood

Các vấn đề liên quan