2009-03-03 8 views
5

Я установил плагин acts_as_versioned из github.com в моем приложении рельсы, и там был блок кода, который я полностью не понимаю, я надеялся, что кто-то может очистить это для меняОбщий вопрос о Руби

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

Я получаю, что методы внутри блока (или что бы то ни было) определяются как методы экземпляра внутри класса, но я не могу найти CLASS_METHODS, определенные как константа в любом месте плагина, и я также не уверен что < < - после class_eval означает. плагин расположен here, и этот код начинается в строке 199 lib/act_as_versioned.rb. Если бы кто-то дал мне низкую цену здесь, я был бы очень обязан.

ТНХ

-C

ответ

7

Это heredoc. http://en.wikipedia.org/wiki/Heredoc#Ruby

Соответствующие маркеры CLASS_METHODS представляют собой начальные и конечные кавычки. Если вы используете < < - вместо < <, конечный токен может быть отступом с пробелом.

Вы можете использовать несколько heredocs сразу в Руби (я сделал свой heredocs так же, как имена аргументов, но это только для эстетического - это не имеет значения):

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

Это "here document", который является способом цитирования больших строк многострочных рядными. От Programming Ruby:

Строки могут продолжаться через несколько строк ввода, и в этом случае они будут содержать символы новой строки. Также можно использовать здесь документы для выражения длинных строковых литералов. Всякий раз, когда Ruby анализирует последовательность <<identifier или <<quoted string, он заменяет ее строковым литералом, построенным из последовательных логических строк ввода. Он перестает строить строку, когда находит строку, начинающуюся с идентификатора или строки с кавычками. Вы можете поместить знак минуса сразу после символов <<, и в этом случае терминатор может быть отступом от левого поля. Если для указания терминатора использовалась строка с кавычками, ее правила цитирования будут применены к документу здесь; в противном случае применяются правила двойного кавычек.

Это заставит class_eval относиться к вещам между CLASS_METHODS в виде строки и выполнить его в соответствующем контексте. Использование имени CLASS_METHODS является произвольным, его можно так же легко назвать чем-то другим.

-2

Они эквивалентны:

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 
Смежные вопросы