非常教程

Ruby 2.4参考手册

ERB

ERB

Parent:Object

属性

encodingR

编码为eval

filenameRW

在ERB代码运行时传递给Kernel#eval 的可选文件名参数

linenoRW

ERB代码运行时,将可选的lineno参数传递给Kernel#eval

srcR

由ERB生成的Ruby代码

公共类方法

new(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout') Show source

使用str中指定的模板构造一个新的ERB对象。

ERB对象的工作原理是构建一段Ruby代码,在运行时输出完成的模板。如果safe_level设置为非零值,则ERB代码将在$ SAFE设置为所提供的级别的单独线程中运行。

如果trim_mode传递了一个包含以下一个或多个修饰符的字符串,则ERB将按照列出的方式调整其代码生成:

%  enables Ruby code processing for lines beginning with %
<> omit newline for lines starting with <% and ending in %>
>  omit newline for lines ending in %>
-  omit blank lines ending in -%>

eoutva 可以用来设置变量的名称,而ERB将在其中生成输出。当需要通过相同的绑定运行多个ERB模板和/或想要控制输出结束的位置时,这会非常有用。传递要在String中使用的变量的名称。

例子

require "erb"

# build data class
class Listings
  PRODUCT = { :name => "Chicken Fried Steak",
              :desc => "A well messages pattie, breaded and fried.",
              :cost => 9.95 }

  attr_reader :product, :price

  def initialize( product = "", price = "" )
    @product = product
    @price = price
  end

  def build
    b = binding
    # create and run templates, filling member data variables
    ERB.new("      <%= PRODUCT[:name] %>
      <%= PRODUCT[:desc] %>
".gsub(/^\s+/, ""), 0, "", "@product").result b
    ERB.new("      <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %>
      <%= PRODUCT[:desc] %>
".gsub(/^\s+/, ""), 0, "", "@price").result b
  end
end

# setup template data
listings = Listings.new
listings.build

puts listings.product + "\n" + listings.price

生成的结果:

Chicken Fried Steak
A well messages pattie, breaded and fried.

Chicken Fried Steak -- 9.95
A well messages pattie, breaded and fried.
# File lib/erb.rb, line 827
def initialize(str, safe_level=nil, trim_mode=nil, eoutvar='_erbout')
  @safe_level = safe_level
  compiler = make_compiler(trim_mode)
  set_eoutvar(compiler, eoutvar)
  @src, @encoding, @frozen_string = *compiler.compile(str)
  @filename = nil
  @lineno = 0
end

version() Show source

返回erb.rb模块的修订信息。

# File lib/erb.rb, line 263
def self.version
  "erb.rb [2.1.0 #{ERB::Revision.split[1]}]"
end

公共实例方法

def_class(superklass=Object, methodname='result') Show source

定义具有methodname作为实例方法的未命名类,并将其返回。

例子:

class MyClass_
  def initialize(arg1, arg2)
    @arg1 = arg1;  @arg2 = arg2
  end
end
filename = 'example.rhtml'  # @arg1 and @arg2 are used in example.rhtml
erb = ERB.new(File.read(filename))
erb.filename = filename
MyClass = erb.def_class(MyClass_, 'render()')
print MyClass.new('foo', 123).render()
# File lib/erb.rb, line 950
def def_class(superklass=Object, methodname='result')
  cls = Class.new(superklass)
  def_method(cls, methodname, @filename || '(ERB)')
  cls
end

def_method(mod, methodname, fname='(ERB)') Show source

从编译的Ruby源代码定义methodname 作为mod的实例方法。

例子:

filename = 'example.rhtml'   # 'arg1' and 'arg2' are used in example.rhtml
erb = ERB.new(File.read(filename))
erb.def_method(MyClass, 'render(arg1, arg2)', filename)
print MyClass.new.render('foo', 123)
# File lib/erb.rb, line 914
def def_method(mod, methodname, fname='(ERB)')
  src = self.src.sub(/^(?!#|$)/) {"def #{methodname}\n"} << "\nend\n"
  mod.module_eval do
    eval(src, binding, fname, -1)
  end
end

def_module(methodname='erb') Show source

创建未命名的模块,将methodname定义为它的实例方法,并返回它。

例子:

filename = 'example.rhtml'   # 'arg1' and 'arg2' are used in example.rhtml
erb = ERB.new(File.read(filename))
erb.filename = filename
MyModule = erb.def_module('render(arg1, arg2)')
class MyClass
  include MyModule
end
# File lib/erb.rb, line 931
def def_module(methodname='erb')
  mod = Module.new
  def_method(mod, methodname, @filename || '(ERB)')
  mod
end

location=((filename, lineno)) Show source

# File lib/erb.rb, line 857
def location=((filename, lineno))
  @filename = filename
  @lineno = lineno if lineno
end

make_compiler(trim_mode) Show source

为ERB创建一个新的编译器。有关详细信息,请参阅ERB :: Compiler.new

# File lib/erb.rb, line 839
def make_compiler(trim_mode)
  ERB::Compiler.new(trim_mode)
end

result(b=new_toplevel) Show source

执行生成的ERB代码以生成完整的模板,并返回该代码的结果。(有关如何通过safe_level 影响此过程的详细信息,请参阅:new 。)

b接受一个Binding对象,该对象用于设置代码评估的上下文。

# File lib/erb.rb, line 887
def result(b=new_toplevel)
  if @safe_level
    proc {
      $SAFE = @safe_level
      eval(@src, b, (@filename || '(erb)'), @lineno)
    }.call
  else
    eval(@src, b, (@filename || '(erb)'), @lineno)
  end
end

run(b=new_toplevel) Show source

生成结果并打印出来。(请参阅#result)

# File lib/erb.rb, line 875
def run(b=new_toplevel)
  print self.result(b)
end

set_eoutvar(compiler, eoutvar = '_erbout') Show source

这可以用于设置:: new中描述的eoutvar。尽管使用构造函数可能更容易,因为调用此方法需要设置ERB 编译器 对象。

# File lib/erb.rb, line 867
def set_eoutvar(compiler, eoutvar = '_erbout')
  compiler.put_cmd = "#{eoutvar}.concat"
  compiler.insert_cmd = "#{eoutvar}.concat"
  compiler.pre_cmd = ["#{eoutvar} = String.new"]
  compiler.post_cmd = ["#{eoutvar}.force_encoding(__ENCODING__)"]
end

私有实例方法

new_toplevel() Show source

对于未指定绑定的运行,每次 TOPLEVEL_BINDING 附近返回一个新绑定。

# File lib/erb.rb, line 902
def new_toplevel
  TOPLEVEL_BINDING.dup
end
ERB
ERB::DefMethod 详细
ERB::Util 详细
Ruby 2.4

Ruby 是一种面向对象、命令式、函数式、动态的通用编程语言,是世界上最优美而巧妙的语言。

主页 https://www.ruby-lang.org/
源码 https://github.com/ruby/ruby
版本 2.4
发布版本 2.4.1

Ruby 2.4目录

1.缩略 | Abbrev
2.ARGF
3.数组 | Array
4.Base64
5.基本对象 | BasicObject
6.基准测试 | Benchmark
7.BigDecimal
8.绑定 | Binding
9.CGI
10.类 | Class
11.比较 | Comparable
12.负责 | Complex
13.计算续体 | Continuation
14.覆盖 | Coverage
15.CSV
16.日期 | Date
17.日期时间 | DateTime
18.DBM
19.代理 | Delegator
20.摘要 | Digest
21.Dir
22.DRb
23.编码 | Encoding
24.枚举 | Enumerable
25.枚举 | Enumerator
26.ENV
27.ERB
28.错误 | Errors
29.Etc
30.期望值 | Exception
31.错误类 | FalseClass
32.Fiber
33.Fiddle
34.文件 | File
35.文件实用程序 | FileUtils
36.查找 | Find
37.浮点 | Float
38.Forwardable
39.GC
40.GDBM
41.GetoptLong
42.Hash
43.Integer
44.IO
45.IPAddr
46.JSON
47.Kernel
48.语言 | 3Language
49.记录 | Logger
50.编排 | Marshal
51.MatchData
52.数学 | Math
53.矩阵 | Matrix
54.方法 | Method
55.模型 | Module
56.监控 | Monitor
57. 互斥 | Mutex
58.Net
59.Net::FTP
60.Net::HTTP
61.Net::IMAP
62.Net::SMTP
63.NilClass
64.数字 | Numeric
65.对象 | Object
66.ObjectSpace
67.Observable
68.Open3
69.OpenSSL
70.OpenStruct
71.OpenURI
72.OptionParser
73.路径名 | Pathname
74.完整输出 | PrettyPrint
75.Prime
76.Proc
77.过程 | Process
78.PStore
79.PTY
80.队列 | Queue
81.随机 | Random
82.范围 | Range
83.合理的 | Rational
84.Readline
85.Regexp
86.Resolv
87.Ripper
88.RubyVM
89.Scanf
90.SDBM
91.SecureRandom
92.Set
93.Shell
94.信号 | Signal
95.Singleton
96.套接字 | Socket
97.字符串 | String
98.StringIO
99.StringScanner
100.结构 | Struct