2010-11-10 28 views
9

Tôi đang nhảy vào đường ray lập trình cho lần đầu tiên và khi nhìn vào mã cho một số thư viện tôi đã tải về, thỉnh thoảng tôi nhận thấy các mã:Ai đó có thể giải thích lớp << tự cho tôi không?

class << self 
    def func 
    stuff 
    end 
end 

Tôi đã thử tìm kiếm trên web cho một lời giải thích , nhưng < < bị tước khỏi hầu hết các công cụ tìm kiếm hữu ích, vì vậy nó kết thúc bằng việc tìm kiếm tự lớp, điều này không hữu ích lắm. Bất kỳ cái nhìn sâu sắc sẽ được đánh giá cao.

+2

là Google không phải là một công cụ tìm kiếm hữu ích? http://www.google.com/search?source=ig&hl=vi&rlz=&=&q=class+%3C%3C+self&btnG=Google+Search – McKay

+0

@McKay: Ngoài http://forums.pragprog.com/forums/77/topics/657, không hoàn toàn giống với những gì Wade đang làm, những hit nào liên quan đến câu hỏi của Wade? –

+0

Hai lượt truy cập đầu tiên đều có liên quan (thứ ba được cho là như vậy). Liên kết thứ hai (http://www.thekode.net/blog/blog.html) nói về thành ngữ cụ thể và liên kết: http://www.thekode.net/ruby/techniques/DefiningMethodsWithClosures.html cũng có thể là Cứu giúp. – McKay

Trả lời

12

Trong Ruby, class << foo mở ra lớp singleton của đối tượng được tham chiếu bởi foo. Trong Ruby, mỗi đối tượng có một lớp singleton liên kết với nó chỉ có một cá thể duy nhất. Lớp đơn này giữ hành vi đối tượng cụ thể, tức là các phương thức singleton.

Vì vậy, class << self mở lớp singleton số self. Chính xác là self, tùy thuộc vào ngữ cảnh bạn đang ở, tất nhiên. Trong một mô-đun hoặc lớp định nghĩa cơ thể, nó là mô-đun hoặc lớp chính nó, ví dụ.

Nếu tất cả các bạn đang sử dụng lớp singleton cho, là xác định phương pháp singleton, có thực sự là một phím tắt cho rằng: def foo.bar.

Dưới đây là một ví dụ về cách sử dụng phương pháp singleton để cung cấp một số "thủ tục" mà không thực sự có liên quan bất kỳ với một trường hợp cụ thể:

class << (Util = Object.new) 
    def do_something(n) 
    # ... 
    end 
end 

Util.do_something(n) 
+0

Vì vậy, về cơ bản nó là cách Ruby xử lý những gì sẽ là một phương pháp tĩnh trong một ngôn ngữ như Java? Có sự khác biệt nào không? –

+0

@Wade - phần def giống như một phương pháp tĩnh, có. Nhưng bạn có thể thao tác các biến cấp lớp bên trong khối kết thúc lớp << mở và thực hiện các hoạt động khác trong đó. Các định nghĩa lớp của Ruby được thực hiện, không đọc tĩnh. Ví dụ, bạn có thể chạy các phương thức mức lớp khác ở đó và định nghĩa các lớp khác ở đó. –

2

Đó là tương đương với

def self.func 
    stuff 
end 

Trừ rằng tất cả các phương pháp lồng trong nó là phương pháp lớp. Nó cho phép bạn khai báo một số phương thức là các phương thức lớp, mà không cần vẽ từng phương thức trên self.

+0

Nó tốt cho nhiều hơn chỉ là phương pháp lớp học. – Chuck

+0

Đúng, nhưng đó là trường hợp phổ biến. –

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