附加库

附加库

在php?name=Ruby" onclick="tagshow(event)" class="t_tag">Ruby中, 可以使用库来添加新的类,模块或方法. 下列就是标准发布包中附加库的一览表. 读取库时需要使用require或load.
附加库一览表

文本 /文件 /网络 /输入输出 /日语 /数学 /数据库 /画面控制/CUI /GUI /日期·时间 /多线程·同步 /Unix /MS Windows /正则表达式 /GC /Design Pattern /开发工具 /命令行 /其他

  * English.rb 给特殊变量 $! 等添加英文别名($ERROR_INFO 等)
  * Env.rb 该库已经停用(obsolete)
  * base64.rb 处理Base64编码的模块
  * benchmark.rb ruby 1.7 特性
  * bigdecimal.so 可变长度浮点数运算 ruby 1.8 特性
  * bigdecimal/jacobian.rb
  * bigdecimal/ludcmp.rb
  * bigdecimal/newton.rb
  * bigdecimal/nlsolve.rb
  * bigdecimal/utils.rb
  * cgi/session.rb CGI会话管理
    o CGI::Session
  * cgi/session/pstore.rb
    o CGI::Session::PStore
  * cgi-lib.rb 该库已经停用(obsolete)(请使用cgi.rb)
  * cgi.rb 辅助生成CGI
    o CGI
  * complex.rb 复数类
    o Complex
  * csv.rb CSV(Comma Separated Values)库 ruby 1.8 特性
  * curses.so 终端操作库 curses 的接口
    o Curses 模块
    o Curses::Window 类
  * date.rb 日期类
    o Date
    o DateTime
  * date2.rb 该库已经停用(obsolete)(请使用date.rb)
  * dbm.so 可将ndbm用作哈希表的库
    o DBM
  * debug.rb Ruby 调试器
  * delegate.rb 支持委托的类
    o Delegator
      + SimpleDelegator
  * digest.so 消息摘要库 请参考[ruby-src:ext/digest/digest.txt.ja]
  * digest/md5.so
  * digest/rmd160.so
  * digest/sha1.so
  * digest/sha2.so
    o Digest::Base
      + Digest::MD5
      + Digest::RMD160
      + Digest::SHA1
      + Digest::SHA256
      + Digest::SHA384
      + Digest::SHA512
  * dl.so [ruby-src:ext/dl/doc/dl.txt]ruby 1.7 特性
  * dl/import.rb 请参考dl.so 。ruby 1.7 特性
  * dl/struct.rb 请参考dl.so 。ruby 1.7 特性
  * dl/types.rb 请参考dl.so 。ruby 1.7 特性
  * dl/win32.rb 用来代替Win32API。ruby 1.7 特性
  * drb.rb 分布式 Ruby (dRuby) ruby 1.8 特性
  * e2mmap.rb 异常类和消息的映象
    o Exception2MessageMapper
  * enumerator.so
    o Enumerable::Enumerator
  * erb.rb 嵌入 Ruby (ERB) ruby 1.8 特性
    o ERB
  * eregex.rb 可使用`|', `&'操作符将2个正则表达式连接起来
  * etc.so 操作/etc/passwd等的库
    o Etc
  * expect.rb 在脚本中控制交互程序
  * fcntl.so 该模块中囊括了fcntl(2)中用到的常数
    o Fcntl
  * fileutils.rb 文件操作utility (ftools.rb 的升级版) ruby 1.7 特性
    o module FileUtils
    o module FileUtils::Verbose
    o module FileUtils::NoWrite
  * final.rb 该库已经停用(obsolete)(已被纳入系统. 在1.8中,该库已被取消)
  * finalize.rb
    o Finalizer
  * find.rb 文件搜索模块
    o Find
  * forwardable.rb 向类中定义方法委托的功能(请参考[ruby-src:doc/forwardable.rd.ja])
    o Forwardable
    o SingleForwardable
  * ftools.rb 文件操作utility(旧)
  * ftplib.rb 该库已经停用(obsolete)(请使用net/ftp.rb. 在1.8中,该库已被取消)
  * gdbm.so 将gdbm (GNU dbm)用作哈希表的库
    o GDBM
  * getoptlong.rb 命令行选项的解析 请参考<URL:http://www.sra.co.jp/people/m-kasahr/ruby/getoptlong/>
  * getopts.rb 命令行选项的解析
  * gserver.rb Ruby Generic Server ruby 1.8 特性
  * iconv.so 字符串编码转换库 [ruby-src:ext/iconv/iconv.c]ruby 1.7 特性
    o Iconv
  * importenv.rb 以操作全局变量的方式来处理环境变量
  * io/nonblock.rb IO 类的扩展(添加与nonblock模式相关的方法)
  * io/wait.so IO 类的扩展(添加负责等待IO输入的方法)
  * ipaddr.rb IP地址类(IPAddr) ruby 1.8 特性
  * irb.rb Interactive Ruby (Ruby 的交互界面) 请参考[ruby-src:doc/irb/irb.rd.ja], [ruby-src:doc/irb/irb-tools.rd.ja]
  * jcode.rb 使String类支持日语
  * kconv.rb 汉字编码转换
    o Kconv
  * mailread.rb 从mail中获取信息
    o Mail
  * mathn.rb
  * matrix.rb 矩阵类
    o Matrix
    o Vector
  * md5.rb 该库已经停用(obsolete)(请使用digest/md5.so)
  * mkmf.rb 制作扩展库的工具
  * monitor.rb
  * multi-tk.rb 支持多个Tcl解释器的Ruby/Tk ruby 1.8 特性
  * mutex_m.rb
  * net/ftp.rb
    o Net::FTP
  * net/ftptls.rb
  * net/http.rb
    o class Net::HTTP
    o class Net::HTTPRequest
    o class Net::HTTPResponse
  * net/https.rb
  * net/imap.rb
  * net/pop.rb
    o Net::POP3 class
    o Net::APOP
    o Net::POPMail
  * net/smtp.rb
    o class Net::SMTP
  * net/telnet.rb
    o Net::Telnet
  * net/telnets.rb
  * nkf.so 日语字符代码编码转换
    o NKF
  * observer.rb Ruby中的Observer Pattern
    o Observable
  * open-uri.rb open() 的 URI支持扩展 ruby 1.8 特性
  * open3.rb
    o Open3
  * openssl.rb Ruby/OpenSSL ruby 1.8 特性
  * optparse.rb 命令行选项的解析 ruby 1.7 特性
  * ostruct.rb Python 式的“attr on write”Struct
    o OpenStruct
  * parsearg.rb 命令行选项的解析(请参考getopts.rb)
  * parsedate.rb 日期格式的解析
    o ParseDate
  * pathname.rb 路径名类 ruby 1.8 特性
  * ping.rb 验证数据包是否到达主机
    o Ping
  * pp.rb Pretty-printer ruby 1.7 特性
    o PP
  * prettyprint.rb PrettyPrint ruby 1.7 特性
    o PrettyPrint
  * profile.rb PROFILER
  * profiler.rb ruby 1.7 特性
  * pstore.rb 对象永久化
    o PStore
  * pty.so 处理伪终端(Pseudo tTY)的模块
    o PTY
  * racc/parser.rb Racc 运行时库
  * racc/cparse.so
  * rational.rb
    o Rational
  * rbconfig.rb Ruby 解释器的设置信息
    o Config
  * readbytes.rb
  * readline.so GNU Readline 接口
    o Readline
  * resolv-replace.rb 在处理Socket相关类名时使用resolv.rb
  * resolv.rb Ruby版Resolver
    o Resolv
  * rexml/rexml.rb XML parser ruby 1.8 特性
    o REXML
  * rubyunit.rb [RAA:RubyUnit]兼容库 ruby 1.8 特性
    o RUNIT::Assert
  * scanf.rb ruby 1.8 特性
  * sdbm.so
    o SDBM
  * set.rb 有限集 ruby 1.7 特性
    o Set ruby 1.7 特性
  * sha1.rb 该库已经停用(obsolete)(请使用digest/sha1.so)
  * shell.rb 请参考[ruby-src:doc/shell.rd.ja]
  * shellwords.rb
    o Shellwords
  * singleton.rb Ruby中的Singleton Pattern
    o Singleton
  * socket.so socket扩展库
    o BasicSocket
      + IPSocket
        # TCPSocket
          * TCPServer
          * SOCKSSocket
        # UDPSocket
      + UNIXSocket
        # UNIXServer
      + Socket
    o Socket::Constants
  * stringio.so 将字符串伪装成IO ruby 1.7 特性
    o StringIO
  * strscan.so 高速Scanner ruby 1.7 特性
    o class StringScanner
  * sync.rb
    o Sync_m
    o Synchronizer_m
    o Sync
    o Synchronizer
  * syslog.so
    o Syslog
    o Syslog::Constants
  * tcltk.rb Tcl/Tk 库 (与tk.rb不同,它直接调用Tcl/Tk)
  * telnet.rb 该库已经停用(obsolete)(请使用net/telnet.rb。在1.8中,该库已被删除)
  * tempfile.rb 生成临时文件
    o Tempfile
  * test/unit.rb unit测试 ruby 1.8 特性
    o Test::Unit
  * thread.rb 与线程相关的utility
    o ConditionVariable
    o Mutex
    o Queue
      + SizedQueue
  * thwait.rb
    o ThreadsWait
    o ThWait
  * time.rb 字符串和Time对象的变换
  * timeout.rb 处理超时的方法 timeout
    o TimeoutError
  * tk.rb Ruby/Tk 请参考<URL:http://ns103.net/~arai/ruby/rubytk.html.gz>
  * tmpdir.rb 返回临时目录 ruby 1.8 特性
  * tracer.rb Ruby 的tracer
    o Tracer
  * tsort.rb 拓扑排序和强连接成分 ruby 1.7 特性
    o TSort
  * un.rb 类似Unix命令的文件操作utility ruby 1.8 特性
  * uri.rb URI 库
  * uri/common.rb
  * uri/ftp.rb
  * uri/generic.rb
  * uri/http.rb
  * uri/https.rb
  * uri/ldap.rb
  * uri/mailto.rb
  * weakref.rb 生成可被GC回收的"弱"reference
    o class WeakRef
    o class WeakRef::RefError
  * webrick.rb WEB server toolkit
  * Win32API.so 调用Win32 API的类 (win32 专用) 以后将用 dl/win32.rb 来取代它
    o Win32API
  * win32ole.so [ruby-src:ext/win32ole/doc/win32ole.rd]ruby 1.7 特性
    o WIN32OLE
  * win32/registry.rb ruby 1.7 特性
    o Win32::Registry
  * xmlrpc/base64.rb ruby 1.8 特性
  * xmlrpc/client.rb ruby 1.8 特性
  * xmlrpc/config.rb ruby 1.8 特性
  * xmlrpc/create.rb ruby 1.8 特性
  * xmlrpc/datetime.rb ruby 1.8 特性
  * xmlrpc/httpserver.rb ruby 1.8 特性
  * xmlrpc/marshal.rb ruby 1.8 特性
  * xmlrpc/parser.rb ruby 1.8 特性
  * xmlrpc/server.rb ruby 1.8 特性
  * xmlrpc/utils.rb ruby 1.8 特性
    o XMLRPC
  * yaml.rb YAML ruby 1.8 特性
  * zlib.so 字符串压缩·扩展 ruby 1.8 特性

范畴分类
文本

  * base64.rb 处理Base64编码的模块
  * csv.rb CSV(Comma Separated Values)库 ruby 1.8 特性
  * digest.so 消息摘要库 请参考[ruby-src:ext/digest/digest.txt.ja]
  * digest/md5.so
  * digest/rmd160.so
  * digest/sha1.so
  * digest/sha2.so
  * erb.rb 嵌入Ruby(ERB) ruby 1.8 特性
  * iconv.so 字符串编码转换库 [ruby-src:ext/iconv/iconv.c]ruby 1.7 特性
  * mailread.rb 从mail中获取信息
  * shellwords.rb
  * stringio.so 将字符串伪装成IO ruby 1.7 特性
  * strscan.so 高速Scanner ruby 1.7 特性
  * yaml.rb YAML ruby 1.8 特性
  * zlib.so 字符串压缩·扩展 ruby 1.8 特性

文件

  * ftools.rb 文件操作utility(旧)
  * fileutils.rb 文件操作utility (ftools.rb 的升级版) ruby 1.7 特性
  * find.rb 文件搜索模块
  * io/nonblock.rb IO 类的扩展(添加与nonblock模式相关的方法)
  * io/wait.so IO 类的扩展(添加负责等待IO输入的方法)
  * pathname.rb 路径名类 ruby 1.8 特性
  * tempfile.rb 生成临时文件
  * tmpdir.rb 返回临时目录 ruby 1.8 特性
  * un.rb 类似Unix命令的文件操作utility ruby 1.8 特性

网络

  * cgi/session.rb CGI会话管理
  * cgi/session/pstore.rb
  * cgi.rb 辅助生成CGI
  * drb.rb 分布式 Ruby (dRuby) ruby 1.8 特性
  * gserver.rb Ruby Generic Server ruby 1.8 特性
  * ipaddr.rb IP地址类(IPAddr) ruby 1.8 特性
  * net/ftp.rb
  * net/ftptls.rb
  * net/http.rb
  * net/https.rb
  * net/imap.rb
  * net/pop.rb
  * net/smtp.rb
  * net/telnet.rb
  * net/telnets.rb
  * openssl.rb Ruby/OpenSSL ruby 1.8 特性
  * open-uri.rb open() 的 URI支持扩展 ruby 1.8 特性
  * ping.rb 验证数据包是否到达主机
  * resolv-replace.rb 在处理Socket相关类名时使用resolv.rb
  * resolv.rb Ruby版Resolver
  * socket.so socket扩展库
  * webrick.rb WEB server toolkit
  * xmlrpc/base64.rb XML-RPC (remote procedure calls over HTTP using XML) for Ruby ruby 1.8 特性
  * xmlrpc/client.rb ruby 1.8 特性
  * xmlrpc/config.rb ruby 1.8 特性
  * xmlrpc/create.rb ruby 1.8 特性
  * xmlrpc/datetime.rb ruby 1.8 特性
  * xmlrpc/httpserver.rb ruby 1.8 特性
  * xmlrpc/marshal.rb ruby 1.8 特性
  * xmlrpc/parser.rb ruby 1.8 特性
  * xmlrpc/server.rb ruby 1.8 特性
  * xmlrpc/utils.rb ruby 1.8 特性

输入输出

  * open3.rb
  * readbytes.rb
  * scanf.rb ruby 1.8 特性

日语

  * jcode.rb 使String类支持日语
  * kconv.rb 汉字编码转换
  * nkf.so 日语字符代码编码转换

数学

  * bigdecimal.so 可变长度浮点数运算 ruby 1.8 特性
  * bigdecimal/jacobian.rb
  * bigdecimal/ludcmp.rb
  * bigdecimal/newton.rb
  * bigdecimal/nlsolve.rb
  * bigdecimal/utils.rb
  * complex.rb 复数类
  * mathn.rb
  * matrix.rb 矩阵类
  * rational.rb
  * set.rb 有限集 ruby 1.7 特性

数据库

  * dbm.so 可将ndbm用作哈希表的库
  * gdbm.so 将gdbm (GNU dbm)用作哈希表的库
  * pstore.rb 对象永久化
  * sdbm.so

画面控制/CUI

  * curses.so 终端操作库 curses 的接口
  * expect.rb 在脚本中控制交互程序
  * fcntl.so 该模块中囊括了fcntl(2)中用到的常数
  * irb.rb Interactive Ruby (Ruby 的交互界面)
  * pty.so 处理伪终端(Pseudo tTY)的模块
  * readline.so GNU Readline 接口
  * shell.rb 请参考[ruby-src:doc/shell.rd.ja]

GUI

  * multi-tk.rb 支持多个Tcl解释器的Ruby/Tk ruby 1.8 特性
  * tk.rb Ruby/Tk <URL:http://ns103.net/~arai/ruby/rubytk.html.gz>

日期·时间

  * date.rb 日期类
  * parsedate.rb 日期格式的解析
  * time.rb 字符串和Time对象的变换

多线程·同步

  * monitor.rb
  * mutex_m.rb
  * sync.rb
  * thread.rb 与线程相关的utility
  * thwait.rb

Unix

  * etc.so 操作/etc/passwd等的库
  * syslog.so UNIX syslog 接口

MS Windows

  * Win32API.so 调用Win32 API的类 (win32 专用) 以后将用 dl/win32.rb 来取代它
  * win32ole.so [ruby-src:ext/win32ole/doc/win32ole.rd]ruby 1.7 特性
  * win32/registry.rb ruby 1.7 特性

正则表达式

  * eregex.rb 可使用`|', `&'操作符将2个正则表达式连接起来

GC

  * finalize.rb
  * weakref.rb 生成可被GC回收的"弱"reference

Design Pattern

  * delegate.rb 支持委托的类
  * forwardable.rb 向类中定义方法委托的功能(请参考[ruby-src:doc/forwardable.rd.ja])
  * observer.rb Ruby中的Observer Pattern
  * singleton.rb Ruby中的Singleton Pattern

开发工具

  * benchmark.rb ruby 1.7 特性
  * debug.rb Ruby 调试器
  * mkmf.rb 制作扩展库的工具
  * profile.rb PROFILER
  * profiler.rb ruby 1.7 特性
  * rbconfig.rb Ruby 解释器的设置信息
  * rubyunit.rb [RAA:RubyUnit]兼容库 ruby 1.8 特性
  * test/unit.rb unit测试 ruby 1.8 特性
  * tracer.rb Ruby 的tracer

命令行

  * getoptlong.rb 命令行选项的解析
  * getopts.rb 命令行选项的解析
  * parsearg.rb 命令行选项的解析(getopts.rb)
  * optparse.rb 命令行选项的解析 ruby 1.7 特性

其他

  * English.rb 给特殊变量 $! 等添加英文别名($ERROR_INFO 等)
  * dl.so [ruby-src:ext/dl/doc/dl.txt]ruby 1.7 特性
  * dl/import.rb 请参考dl.so 。ruby 1.7 特性
  * dl/struct.rb 请参考dl.so 。ruby 1.7 特性
  * dl/types.rb 请参考dl.so 。ruby 1.7 特性
  * dl/win32.rb 用来代替Win32API。ruby 1.7 特性
  * e2mmap.rb 异常类和消息的映象
  * enumerator.so
  * importenv.rb 以操作全局变量的方式来处理环境变量
  * ostruct.rb Python 式的“attr on write”Struct
  * pp.rb Pretty-printer ruby 1.7 特性
  * prettyprint.rb PrettyPrint ruby 1.7 特性
  * racc/parser.rb Racc 运行时库
  * racc/cparse.so
  * rexml/rexml.rb XML parser ruby 1.8 特性
  * timeout.rb 处理超时的方法 timeout
  * tsort.rb 拓扑排序和强连接成分 ruby 1.7 特性
  * uri.rb URI 库
  * uri/common.rb
  * uri/ftp.rb
  * uri/generic.rb
  * uri/http.rb
  * uri/https.rb
  * uri/ldap.rb
  * uri/mailto.rb
为特殊变量$!等添加英语别名($ERROR_INFO 等)。
用法

require 'English'

特殊变量

特殊变量与别名的对应关系如下。

$ERROR_INFO

  $! 的别名
$ERROR_POSITION

  $@ 的别名
$LOADED_FEATURES

  $" 的别名
$FS
$FIELD_SEPARATOR

  $; 的别名
$OFS
$OUTPUT_FIELD_SEPARATOR

  $, 的别名
$RS
$INPUT_RECORD_SEPARATOR

  $/ 的别名
$ORS
$OUTPUT_RECORD_SEPARATOR

  $\ 的别名
$INPUT_LINE_NUMBER
$NR

  $. 的别名
$LAST_READ_LINE

  $_ 的别名
$DEFAULT_OUTPUT

  $> 的别名
$DEFAULT_INPUT

  $< 的别名
$PID
$PROCESS_ID

  $$ 的别名
$CHILD_STATUS

  $? 的别名
$LAST_MATCH_INFO

  $~ 的别名
$IGNORECASE

  $= 的别名
$PROGRAM_NAME

  $0 的别名
$ARGV

  $* 的别名
$MATCH

  $& 的别名
$PREMATCH

  $` 的别名
$POSTMATCH

  $' 的别名
$LAST_PAREN_MATCH

  $+ 的别名
该库已经停用(obsolete)。请参考importenv.rb。
[2001/02/07] rubikitch

[2001/02/11] 荒井: 更新

定义了MIME Base64解码/编码方法。该库可兼作base64编码的范例脚本。

Base64是一种编码方法, 它只用ASCII码中的65个字符(包括[A-Za-z0-9+/]这64个字符和用作padding的'=')将3字节(8bits * 3 = 24bits)的二进制代码变为4字节(6bits * 4 = 24bits)的可印刷字符串。RFC 2045文件对其做出了详细的规定。
使用方法

irb> require 'base64'
true
irb> b64encode("日本语")
xvzL3Ljs
"xvzL3Ljs\n"
irb> decode64('xvzL3Ljs')
"日本语"
irb> decode_b("日本语")
xvzL3Ljs
"日本语"
irb> decode_b("=?ISO-2022-JP?B?QyAbJEI4QDhsJV0lJCVzJT80MEE0QClHRhsoQg==?=")
"C 言语POINTER完全制霸"

函数

decode64(str)

  对经过Base64编码的str字符串进行解码。
encode64(str)

  对str字符串进行Base64编码。
decode_b(str)

  对包含RFC 2047中定义的encoded-word的str字符串进行解码。

  encoded-word 是形如

  "=?" + charset + "?" + encoding + "?" + encoded-text + "?="

  的字符串, 通常出现在邮件头中。

  该函数只支持"iso-2022-jp"和"shift_jis"类型的charset以及"B"-encoding (Base64)类型的encoding。

  bug

   实际上,该函数会在其内部调用Kconv.toeuc, 所以NKF模块会自动进行解码(请参考NKF的注意事项)。因此, 该函数几乎失去了存在的意义。(以前的Kconv并不使用NKF,所以才会出现这种局面)

b64encode(bin, len = 60)

  对bin字符串进行编码, 在长度为len的地方返回,并显示结果。
-> [ruby-src:lib/benchmark.rb]
Benchmark
模块函数:

Benchmark.measure { ... }
Benchmark.realtime { ... }

  例1:

  require 'benchmark'

  puts Benchmark::CAPTION
  puts Benchmark.measure { "a"*1_000_000 }

  =>

   user  system  total   real
  1.166667 0.050000 1.216667 ( 0.571355)

Benchmark.bm(label_width = 0, *labels) {|job| ... }

  例2:

  require 'benchmark'

  n = 50000
  Benchmark.bm do |x|
  x.report { for i in 1..n; a = "1"; end }
  x.report { n.times do ; a = "1"; end }
  x.report { 1.upto(n) do ; a = "1"; end }
  end

  =>

    user  system  total   real
  1.033333 0.016667 1.016667 ( 0.492106)
  1.483333 0.000000 1.483333 ( 0.694605)
  1.516667 0.000000 1.516667 ( 0.711077)

  例3:

  require 'benchmark'

  n = 50000
  Benchmark.bm(7) do |x|
  x.report("for:") { for i in 1..n; a = "1"; end }
  x.report("times:") { n.times do ; a = "1"; end }
  x.report("upto:") { 1.upto(n) do ; a = "1"; end }
  end

  =>
      user  system  total   real
  for:  1.050000 0.000000 1.050000 ( 0.503462)
  times: 1.533333 0.016667 1.550000 ( 0.735473)
  upto:  1.500000 0.016667 1.516667 ( 0.711239)

Benchmark.bmbm(width = 0) {|job| ... }

  例4:

  require 'benchmark'

  array = (1..1000000).map { rand }

  Benchmark.bmbm do |x|
  x.report("sort!") { array.dup.sort! }
  x.report("sort") { array.dup.sort }
  end

  =>

  Rehearsal -----------------------------------------
  sort! 11.928000 0.010000 11.938000 ( 12.756000)
  sort 13.048000 0.020000 13.068000 ( 13.857000)
  ------------------------------- total: 25.006000sec

      user  system  total   real
  sort! 12.959000 0.010000 12.969000 ( 13.793000)
  sort 12.007000 0.000000 12.007000 ( 12.791000)

Benchmark.benchmark(caption = "", label_width = nil, fmtstr = nil, *labels)

  例5:

  require 'benchmark'

  n = 50000

  # 这与
  #  Benchmark.bm(7, ">total:", ">avg:") do |x| ... end
  # 是一样的
  Benchmark.benchmark(" "*7 + Benchmark::CAPTION,
        7,
        Benchmark::FMTSTR,
        ">total:",
        ">avg:") do |x|

  tf = x.report("for:") { for i in 1..n; a = "1"; end }
  tt = x.report("times:") { n.times do ; a = "1"; end }
  tu = x.report("upto:") { 1.upto(n) do ; a = "1"; end }

  [tf+tt+tu, (tf+tt+tu)/3]
  end

  =>

      user  system  total   real
  for:  1.016667 0.016667 1.033333 ( 0.485749)
  times: 1.450000 0.016667 1.466667 ( 0.681367)
  upto:  1.533333 0.000000 1.533333 ( 0.722166)
  >total: 4.000000 0.033333 4.033333 ( 1.889282)
  >avg:  1.333333 0.011111 1.344444 ( 0.629761)

  fmtstr中使用的是类似于printf的格式化字符串。您可以使用下列格式化字符串

   * %u: user CPU time
   * %y: system CPU time
   * %U: user CPU time of children
   * %Y: system CPU time of children
   * %t: total CPU time
   * %r: real time
   * %n: label string

  若省略fmtstr时, 将使用Benchmark::FMTSTR的值。其内容如下

  "%10.6u %10.6y %10.6t %10.6r\n"
[ruby-src:ext/bigdecimal/bigdecimal_ja.html]

可变长度浮点数运算 ruby 1.8 特性
--> CGI::Session
CGI会话管理
[2001/08/26] by rubikitch
概要

管理CGI会话的库。所谓会话是指通过若干HTTP request来完成一系列动作的过程。进行会话管理时, 既可以使用cgi.rb提供的cookie, 也可以使用这个简单易懂的cgi/session.rb。会话信息采用的是类似Hash的接口。

使用该cgi/session.rb时, 由服务器来管理会话信息, 再用cookie把与会话信息相对应的会话ID传给客户端。由于cookie中并未指定expires, 所以一旦关闭浏览器, cookie也将消亡。
用法
生成

cgi = CGI::new
session = CGI::Session::new( cgi [, aHash] )

将CGI对象传递给CGI::Session::new。可选参数aHash中可用的键值(及其意义)如下。

"session_path"

  用作cookie的path. (default: File::dirname(ENV["SCRIPT_NAME"]), 直到脚本中URI的path部分的最后一条斜线为止)
"session_key"

  用作cookie和<FORM type=hidden>的name. (default: "_session_id")
"session_id"

  用作会话ID. 若使用默认数据库FileStore时, 其值只能是由英文和数字构成的字符串. 若使用了该选项的话, 即使request中包含会话ID,也会被忽略. (default: 随机生成)
"new_session"

  若其值为true,则会强行生成新的会话. 若使用了该选项的话, 即使request中包含会话ID,也会被忽略. (default: false)
"database_manager"

  数据库. (defalut: CGI::Session::FileStore)

  CGI::Session::FileStore

   使用文本文件。只处理字符串数据。
  CGI::Session::MemoryStore

   使用内存中的哈希表。只在Ruby解释器的工作期间有效。
  CGI::Session::PStore

   使用Marshall格式, 可以保存任何类型的数据。该功能由cgi/session/pstore.rb提供。

"tmpdir"

  CGI::Session::FileStore生成会话数据时的目录名. (default: ENV["TMP"] || "/tmp")
"prefix"

  CGI::Session::FileStore给会话数据的文件名添加的前缀. (default: "")

记录会话信息

session['name'] = "rubikitch"

CGI::Session对象的运作方式类似于Hash, 它负责记录与索引相对应的元素值。
获取会话信息。

name = session['name']

使用其他的CGI来获取会话信息时, 要这样处理。
Header输出

只要使用了CGI#out、CGI#header的话,就可以按照常规方式来处理Header输出问题了。cgi/session.rb在内部使用了cookie,而具体的处理步骤是由这些方法完成的, 所以没必要为此劳心费神。
umask值

若umask值为0022的话, 则会话信息文件的permission变为644, 因此任何用户都可以查看会话信息文件。若不想这样的话, 请在生成CGI::Session对象之前预先设置好umask值即可。
用例

该CGI例程非常简单, 输入用户名就会出现问候语。

演示例程库在这里。
源代码

#!/usr/bin/ruby
require 'kconv'
require 'cgi'
require 'cgi/session'

class SessionDemo
 def initialize
  @cgi = CGI::new
  File.umask(0066)           # 不想让别人查看会话文件
  @session = CGI::Session::new( @cgi )    # 这样生成会话。
  @cmd = "#{@cgi['cmd'].first}"       # 这样的话,在ruby 1.8 中也可以运行了(会出现warning)
  @cmd = 'start' if @cmd.empty?
  @header = { "type" => "text/html", "charset" => "euc-jp" }

  __send__("cmd_#{@cmd}")
 end

 def cmd_start
  @cgi.out( @header ) {
  <<-END
  <html><head><title>CGI::Session Demo</title></head>
  <body>
   <form action="#{ENV['SCRIPT_NAME']}" method="get">
   <p>
   您的名字是?
   <input type="text" name="name">
   <input type="hidden" name="cmd" value="hello">
   <input type="submit" value="确定">
   </p>
   </form>
  </body></html>
  END
  }
 end

 def cmd_hello
  name = Kconv::toeuc( @cgi['name'].first )
  @session['name'] = name         # 存入会话
  @cgi.out( @header ) {         # 会话信息存在隐藏cookie中,所以使用CGI#out来输出
  <<-END
  <html><head><title>CGI::Session Demo</title></head>
  <body>
   <p>#{name},你好</p>
   <p><a href="#{ENV['SCRIPT_NAME']}?cmd=bye">[下一步]</a></p>
  </body></html>
  END
  }
 end

 def cmd_bye
  name = @session['name']         # 从会话数据中获取信息
  @cgi.out( @header ) {
  <<-END
  <html><head><title>CGI::Session Demo</title></head>
  <body>
   <p>#{name}, 再见</p>
   <p><a href="#{ENV['SCRIPT_NAME']}">[返回]</a></p>
  </body></html>
  END
  }
 end
end

SessionDemo.new

class CGI::Session
类方法

CGI::Session.new(cgi[, aHash])

  新生成并返回一个会话对象。

实例方法

CGI::Session#[key]

  返回指定索引的值。
CGI::Session#[key] = val

  设定指定索引的值。
CGI::Session#update

  调用数据库类的update方法, 将会话信息存入服务器。

  若是MemoryStore的话, 则不会进行任何操作。
CGI::Session#close

  调用数据库类的close方法, 将会话信息存入服务器, 关闭会话存储器。
CGI::Session#delete

  调用数据库类的delete方法, 从存储器中删除会话。

  若是FileStore的话,就删除会话文件。若非显式地删除会话文件的话, 它将被保留下来。

CGI::HtmlExtension#form 的输出

CGI::Session.new后的CGI::HtmlExtension#form将自动输出存有会话ID的隐藏field。CGI::Session.new会自动将新生成的form field值识别为会话ID。

若使用CGI::HtmlExtension#form,并通过<INPUT TYPE="submit">来实现页面跳转的话, 就可以在那些无法使用cookie的环境中保持会话信息了。

#!/usr/bin/ruby
require 'cgi'
require 'cgi/session'

cgi = CGI::new('html3')
File.umask(0066)
session = CGI::Session::new(cgi)
cgi.out('charset'=>'euc-jp') {
 html = cgi.html {
  cgi.head { cgi.title {'form Demo'} }
  cgi.body {
  cgi.form('action'=>"#{cgi.script_name}") {
   cgi.p {
    '您的名字是?' +
    cgi.text_field('name') +
    cgi.hidden('cmd', 'hello') +
    cgi.submit('确认')
   }
  }
  }
 }
 CGI.pretty(html)
}
#=>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
 <BODY>
  <FORM METHOD="post" ENCTYPE="application/x-www-form-urlencoded" action="/sample.rb">
  <P>
   您的名字是?
   <INPUT NAME="name" SIZE="40" TYPE="text">
   <INPUT NAME="cmd" TYPE="hidden" VALUE="hello">
   <INPUT TYPE="submit" VALUE="确认">
  </P>
  <INPUT TYPE="HIDDEN" NAME="_session_id" VALUE="bc315cc069266e21">  # 就是这里
  </FORM>
 </BODY>
</HTML>

参考URL

  * <URL:http://www.shugo.net/article/webdb2/#label:13>
CGI::Session:Store