5

Railsアプリケーションにgithub.comからacts_as_versionedプラグインをインストールしましたが、完全には理解できないコードブロックがありました。誰かがこれを解決してくれることを望んでいました

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

ブロック内のメソッド (またはそれが何であれ) がクラス内のインスタンス メソッドとして定義されていることがわかりますが、プラグインのどこにも定数として定義されている CLASS_METHODS が見つかりません。 class_eval の後に意味します。プラグインはここにあり、問題のコードは lib/acts_as_versioned.rb の 199 行目から始まります。誰かが私にここで内情を教えてくれたら、私は大いに義務付けられます.

どうも

-C

4

3 に答える 3

7

ヒアドキュメントです。http://en.wikipedia.org/wiki/Heredoc#Ruby

一致したCLASS_METHODSトークンは、基本的に開始引用符と終了引用符です。<<の代わりに<<-を使用すると、終了トークンを空白でインデントできます。

Rubyでは一度に複数のヒアドキュメントを使用できます(私はヒアドキュメントを引数名と同じにしましたが、それは美的目的のためだけです-違いはありません):

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
于 2009-03-03T02:51:49.413 に答える
6

これは「ヒアドキュメント」であり、大きな複数行の文字列をインラインで引用する方法です。プログラミングRubyから:

文字列は複数の入力行にまたがって継続できます。その場合、文字列には改行文字が含まれます。ヒアドキュメントを使用して、長い文字列リテラルを表現することもできます。Rubyがシーケンス<<identifierまたは<<quoted stringを解析するときはいつでも、連続する論理入力行から構築された文字列リテラルに置き換えます。識別子または引用符で囲まれた文字列で始まる行が見つかると、文字列の作成を停止します。文字の直後にマイナス記号を付けることができます<<。その場合、ターミネータは左マージンからインデントできます。引用符で囲まれた文字列を使用してターミネータを指定した場合、その引用符の規則がヒアドキュメントに適用されます。それ以外の場合は、二重引用符の規則が適用されます。

これによりclass_eval、間にあるものが文字列として扱わCLASS_METHODSれ、適切なコンテキストで実行されます。名前の使用CLASS_METHODSは任意であり、他の名前と同じように簡単に呼び出すことができます。

于 2009-03-03T02:43:40.523 に答える
-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
于 2009-03-03T03:49:36.683 に答える