1

私は最近、このコンテキスト内でRuby EOB/コンストラクトに出くわしました(Ruby id3ライブラリから):-EOB

def initialize(...)
  # ...

  instance_eval <<-EOB
    class << self

      def parse
        # ...
        # Method code
        # ...
      end   
  EOB 
  self.parse # now we're using the just defined parsing routine

  # ...
end

EOBメソッドをオンザフライで生成するためにコードが使用されることは理解していますが、メソッド内でスニペットを使用できるかどうかを知りたいです。さらに別のクラスに含まれる他のメソッドコードを生成するメソッドを書きたいと思います。これは少し混乱するように聞こえますが、いくつかの単純化されたコード サンプルで私の意図を説明しようとします。

# This class reads the code of another 
# Ruby class and injects some methods
class ReadAndInject

  # The method which defines another method
  def get_code_to_be_injected
    "\tdef self.foo\n"+
    "\t\tputs 'bar'\n"+
    "\tend\n"
  end

  # Main entry point, reads a generated Ruby Class
  # and injects specific methods within it
  def read_and_inject

    # Assume placeholder for currently read line,
    # add the generated code within
    current_line += "\n#{get_code_to_be_injected}"
  end

end # class ReadAndInject

注入されるメソッドが正しく追加されているため、これは機能します。それでも、このEOB構成を使用するといくつかの利点が得られるかどうか疑問に思っていました (たとえば、面倒なタブや文字列の連結を追加する必要がないため、コードの視認性が向上します。

結論として、これは の適切な使用例EOBですか? 怪しげでありながら強力な構造のように見えます。私はそれをかわし、グーグルで検索し、 stackoverflowしましたが、RubyCocoa からのもの以外の重要なコード サンプルは返されませんでした。Ruby でメタ構造を使い始めたのはつい最近なので、お手柔らかにお願いします :-)

前もって感謝します!

4

1 に答える 1

3

これらは「ヒア ドキュメント」と呼ばれ、複数の言語でサポートされており、複数行の文字列を作成できます。実際には、EOB だけでなく、任意の区切り文字を使用できます。Ruby には、ヒアドキュメント用の追加機能がいくつかあります。たとえば、-in を<<-EOB使用すると区切り文字をインデントできます。

次のように使用できます。

def code_to_be_injected
  <<-EOS
    def self.foo
      puts 'bar'
    end
  EOS
end

Ruby のいくつかの追加機能:

myvar = 42
<<EOS
variable: #{myvar}
EOS #=> "variable: 42"

<<'EOS'
variable: #{myvar}
EOS #=> "variable: #{myvar}"

print <<A, <<B
This will appear first
A
and this second
B
于 2011-06-26T21:48:10.980 に答える