2009-03-03 46 views
5

Tôi đã cài đặt plugin actions_as_versioned từ github.com trong ứng dụng đường ray của mình và có một khối mã mà tôi không hiểu đầy đủ, tôi hy vọng ai đó có thể xóa nó cho tôiCâu hỏi chung về Ruby

class_eval <<-CLASS_METHODS 
    def a_bunch_of_stuff 
    .... 
    end 
CLASS_METHODS 

Tôi nhận thấy rằng các phương thức bên trong khối (hoặc bất kỳ thứ gì) được định nghĩa là các phương thức thể hiện bên trong lớp, nhưng tôi không thể tìm thấy CLASS_METHODS được định nghĩa là hằng số ở bất kỳ đâu trong plugin và tôi cũng không chắc chắn những gì < < - sau khi class_eval có nghĩa là. plugin nằm ở here và mã được đề cập bắt đầu trên dòng 199 của lib/acts_as_versioned.rb. Nếu ai đó đưa tôi xuống đây, tôi sẽ có nhiều nghĩa vụ.

thx

C

Trả lời

7

Đó là một heredoc. http://en.wikipedia.org/wiki/Heredoc#Ruby

Mã thông báo CLASS_METHODS phù hợp về bản chất là bắt đầu và kết thúc báo giá. Nếu bạn sử dụng < < - thay vì < <, mã thông báo kết thúc có thể được thụt lề bằng khoảng trắng.

Bạn có thể sử dụng nhiều heredocs cùng một lúc trong Ruby (Tôi làm heredocs của tôi giống như tên đối số, nhưng đó chỉ là cho thẩm mỹ - nó làm cho không có sự khác biệt):

def define_with_description description, code 
    puts "defining a method to #{description}" 
    class_eval code 
end 

define_with_description <<-DESCRIPTION, <<-CODE 
    set up us the bomb 
DESCRIPTION 
    Bomb.new.set_up(us) 
CODE 
6

Đây là một "here document", đó là một cách để trích dẫn chuỗi multiline lớn inline. Từ Programming Ruby:

Chuỗi có thể tiếp tục trên nhiều dòng nhập, trong trường hợp này chúng sẽ chứa các ký tự dòng mới. Nó cũng có thể sử dụng tài liệu ở đây để thể hiện các chuỗi ký tự dài. Bất cứ khi nào Ruby phân tích cú pháp chuỗi <<identifier hoặc <<quoted string, nó sẽ thay thế nó bằng một chuỗi ký tự được xây dựng từ các dòng nhập logic hợp lý kế tiếp. Nó dừng xây dựng chuỗi khi nó tìm thấy một dòng bắt đầu bằng số nhận dạng hoặc chuỗi được trích dẫn. Bạn có thể đặt dấu trừ ngay lập tức sau các ký tự <<, trong trường hợp đó, trình kết thúc có thể được thụt lề từ lề trái. Nếu một chuỗi trích dẫn được sử dụng để chỉ định trình kết thúc, các quy tắc trích dẫn của nó sẽ được áp dụng cho tài liệu ở đây; nếu không, các quy tắc trích dẫn kép sẽ được áp dụng.

Điều này sẽ gây ra class_eval để xử lý nội dung giữa CLASS_METHODS dưới dạng chuỗi và thực thi trong ngữ cảnh thích hợp. Việc sử dụng tên CLASS_METHODS là tùy ý, nó có thể dễ dàng được gọi là bất cứ điều gì khác.

-2

Đây là tương đương:

class SomeClass 
    class_eval <<-CLASS_METHODS 
    def first_method 
    end 
    def second_method 
    end 
    CLASS_METHODS 
end 

class SomeClass 
    def self.first_method 
    end 
    def self.second_method 
    end 
end