Общий вопрос о Ruby - PullRequest
       31

Общий вопрос о Ruby

5 голосов
/ 03 марта 2009

Я установил плагин act_as_versioned от github.com в своем приложении rails, и был блок кода, который я не до конца понимаю, я надеялся, что кто-нибудь сможет это прояснить для меня

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

Я получаю, что методы внутри блока (или что бы то ни было) определяются как методы экземпляра внутри класса, но я не могу найти CLASS_METHODS, определенную как константу, в любом месте плагина, и я также не уверен << - после class_eval означает. плагин расположен <a href="http://github.com/technoweenie/acts_as_versioned/tree/master" rel="nofollow noreferrer"> здесь , а рассматриваемый код начинается в строке 199 файла lib / acts_as_versioned.rb. Если бы здесь кто-нибудь дал мне ответ, я был бы очень благодарен.

ТНХ

-C * +1010 *

Ответы [ 3 ]

7 голосов
/ 03 марта 2009

Это наследственность. http://en.wikipedia.org/wiki/Heredoc#Ruby

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

Вы можете использовать несколько heredocs одновременно в Ruby (я сделал мои 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 голосов
/ 03 марта 2009

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

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

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

0 голосов
/ 03 марта 2009

Это эквивалентно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...