附加库

该库已被date.rb所取代
--> DBM
访问NDBM文件的类。除了数据保存在文件中这个特点,以及索引和数据都必须是字符串这个限制之外,可以像对待Hash类那样来处理该类。
超类:

  * Object

包含的模块:

  * Enumerable

类方法:

open(dbname[, mode[, flags]])

  将dbname所指数据库的模式设置为mode之后再打开该数据库。省略mode时,其默认值为0666。若将mode指定为nil的话,一旦没有数据库时就会直接返回nil而并不会生成新的数据库。

  在Ruby 1.8.2 以后的版本中,可以指定flags参数。flags参数中可用的内容如下。

   * DBM::READER : 只是读入数据库
   * DBM::WRITER : 读写数据库,且不会生成新数据库
   * DBM::WRCREAT : 读写数据库,若没有数据库就新建一个
   * DBM::NEWDB : 总是新建数据库,此前的数据将被破坏

方法:

self[key]

  返回索引等于key的元素的値。
self[key]=value

  将key设为索引,并将value存为该元素的值。若将value指定为nil时,将删除与key相对应的元素。
clear

  清空DBM文件。
close

  关闭DBM文件。此后的操作将引发异常。
delete(key)

  删除索引等于key的元素。
delete_if { |key, value| ... }

  若块的计算值为真,就删除相应的元素。
each {|key, value| ... }
each_pair {|key, value| ... }

  对各要素进行迭代操作。
each_key {|key| ... }

  对所有的key进行循环操作的迭代器。
each_value {|value| ... }

  对所有的value进行循环操作的迭代器。
empty?()

  若数据库为空,则返回真。
has_key?(key)
key?(key)
include?(key)

  若数据库中包含key时,返回真。
has_value?(value)
value?(value)

  若数据库中包含值为value的元素时,就返回真。
indexes(key_1, ... ) obsolete
indices(key_1, ... ) obsolete

  返回一个以各参数值为索引的元素构成的数组。
keys

  返回一个以数据库中全部索引所构成的数组。
length
size

  返回数据库中的元素个数。(注意:在目前情况下,要想取得元素的个数就必须对整个数据库进行检索)
shift

  取出数据库中的一个元素,并将其从数据库中删除。
values

  返回一个以数据库中全部元素值所构成的数组。

常数

DBM::READER (Ruby 1.8.2 以后)

  以读入模式打开.
DBM::WRITER (Ruby 1.8.2 以后)

  以写入模式打开.
DBM::WRCREAT (Ruby 1.8.2 以后)

  在写入模式下,若没有文件就新建一个。
DBM::NEWDB (Ruby 1.8.2 以后)

  在写入模式下,若文件已存在就将其删除,并重新建一个。
Ruby调试器,用于调试ruby脚本代码。

ruby档案中还有供Emacs使用的接口ruby/misc/rubydb[23]x.el。

rubydb2x.el适用于Emacs 19.2x 以前版本,而rubydb3x.el则对应于Emacs 19.3x以后的版本。
用法:

$ ruby -rdebug foo.rb

而在Emacs中则为

M-x load-library rubydb3x.el
M-x rubydb

调试命令:

以下就是调试器中可用的命令名和用法一览。每条命令名都有简写形式。

若输入了下列命令以外的内容时,将被当作ruby表达式来处理。

break
break [<file>:]<position>|<class>:<method>

  设置断点(break point)。若省略参数时,则显示设置的断点。

  设置的断点的格式为 程序文件名:位置 或者 类名:方法名。 位置是指文件中的行号或方法名。 若省略文件名:,则看作是指定了当前运行中的文件。

  该命令简写为 b。
catch <an Exception>

  设置Catch Point,一旦发生异常时调试器将停在Catch Point的地方。若省略参数时,将显示设定的Catch Point。

  若实际出现的异常是<an Exception>的子类的话,调试器会停止运行。StandardError中设定了默认的Catch Point。

  若将<an Exception>设为off的话,即使发生了异常,调试器也不会停止运行。

  该命令简写为 cat。
watch <expression>

  设置Watch Point,一旦表达式 <expression> 的值发生变化时,调试器将停在Watch Point的地方。

  该命令简写为 wat。
delete [nnn]

  删除指定的断点。若省略参数时,将删除所有的断点。

  该命令简写为 del。
display <expression>

  设置display表达式,每当处理过程停止时都会计算<expression>。省略参数时,将显示所有的display表达式。

  该命令简写为 disp。
undisplay <nnn>

  删除指定的display表达式。若省略参数时,将删除所有的display表达式。

  该命令简写为 undisp。
cont

  继续进行处理过程,直到脚本结束或遇到下一个断点。

  该命令简写为 c。
step [nnn]

  一行一行地进行处理。若指定了参数的话,就只处理指定行数的内容。它会进入方法内部。

  该命令简写为 s。
next [nnn]

  一行一行地进行处理。若指定了参数的话,就只处理指定行数的内容。它与step [nnn]的区别在于,遇到方法调用时它不会进入方法的内部。

  该命令简写为 n。
where
frame

  显示frame的堆栈和当前的frame位置。

  该命令简写为 w 或 f。
list [(-|nn-mm)]

  显示脚本。若参数为`-'则显示上一行。若为nn-mm形式,则显示指定范围行的脚本。

  该命令简写为 l。
up [nn]

  转移到上级frame。
down [nn]

  转移到下级frame。
finish

  继续进行处理过程,直到转移到外侧frame为止。

  该命令简写为 fin。
trace [(on|off)]

  更改跟踪模式的设定。若将跟踪模式设为on的话,在以后的运行过程中将会显示方法调用关系。若省略参数时,则显示当前的模式。

  该命令简写为 tr。
quit

  中断脚本,终止调试器的运行。

  该命令简写为 q。
var g[lobal]
var l[ocal]
var i[nstance] <object>
var c[onst] <object>

  分别表示全局变量、局部变量、对象<object>的实例变量、<object>的常数。

  该命令简写为 v。
method i[nstance] <object>
method <class|module>

  分别表示对象<object>的实例方法、类方法或模块方法。

  该命令简写为 m。
thread l[ist]

  线程一览表。

  该命令简写为 th。
thread c[ur[rent]]

  显示当前线程。
thread <nnn>
thread sw[itch] <nnn>

  将运行线程切换为<nnn>。
thread stop <nnn>
thread c[ur[rent]] <nnn>

  挂起<nnn>线程。
thread resume <nnn>

  重启<nnn>线程。
p <expression>

  显示ruby表达式<expression>的结果。
help

  调试命令一览表。

  该命令简写为 h。
目的·概要

负责进行方法的委托(delegation)。

Delegator类会委托指定的对象执行某方法. 在使用Delegator类时, 要先继承它,然后对__getobj__方法进行再定义, 以便指定接受委托的对象.

SimpleDelegator是Delegator的一个实用例子, 它委托构造函数所接收到的对象来执行某方法.

DelegateClass(supperclass)函数负责定义并返回一个委托类, 该类会委托superclass类的某个对象来执行实例方法.


  * Delegator
    o SimpleDelegator

范例代码

require 'delegate'
foo = Object::new
def foo.test
 p 25
end
foo2 = SimpleDelegator::new(foo)
foo2.test # => 25

class ExtArray<DelegateClass(Array)
 def initialize()
  super([])
 end
end
a = ExtArray::new
p a.type # => ExtArray
a.push 25
p a   # => [25]

Delegator

该类为给出的对象提供委托用的方法定义。

在构造函数内部那些被指定对象的实例方法中,定义委托方法, 使得那些不属于自己的方法可以向返回__getobj__的对象进行委托操作.
实例方法

Delegator#initialize(obj)

  定义实例方法,使得obj中不属于自己的实例方法可以向返回__getobj__的对象进行委托操作.
Delegator#__getobj__

  返回接受委托的对象. 默认情况下, 它会引发NotImplementError, 所以必须在子类中进行再定义.

SimpleDelegator

该类利用Delegator类, 委托指定对象执行某方法.

上级类

  Delegator

类方法

SimpleDelegator.new(obj)

  生成一个对象, 它委托obj来执行自身所拥有的方法。

实例方法

SimpleDelegator#__getobj__

  返回接受委托的对象。
SimpleDelegator#__setobj__(obj)

  将接受委托的对象变为obj。

  请注意, 因为只有在生成时才会进行委托方法的定义, 所以即使接受委托的对象和obj之间存在实例方法上的差异, 也无法再次设定委托实例方法.

函数

DelegateClass(superclass)

  定义并返回一个委托类, 它委托superclass类的实例来执行某方法.

SEE ALSO

Object#method_missing(method_symbol, ...)

  若对象中尚未定义某方法时, 就会调用该方法. 使用该方法, 您可以将自己不知道的方法委托给其他的对象.

  例:

  def hoge.method_missing(message, *arg)
   @to_obj.send(message, *arg)
  end
消息摘要库 请参考[ruby-src:ext/digest/digest.txt.ja]
类的层次

  * Digest::Base
    o Digest::MD5
    o Digest::RMD160
    o Digest::SHA1
    o Digest::SHA256
    o Digest::SHA384
    o Digest::SHA512

所有实际的消息摘要类的接口都与底层类Digest::Base的接口相同.
-> digest.so
所有Digest::XXX类的底层类。

例如, 可以像下面这样得到MD5值。

require 'digest/md5'
p Digest::MD5.hexdigest(File.read("ruby-1.8.0.tar.gz"))

# => "582a65e52598a4a1e9fce523e16e67d6"

或者(该方法不会生成大字符串)

require 'digest/md5'

class Digest::Base
 def self.open(path)
  obj = new

  File.open(path) {|f|
  buf = ""
  while f.read(256, buf)
   obj << buf
  end
  }
  obj
 end
end

p Digest::MD5.open("ruby-1.8.0.tar.gz").hexdigest

# => "582a65e52598a4a1e9fce523e16e67d6"

所有的Digest::XXX类都具有下列相同的接口。
超类:

  * Digest::Base

类方法:

Digest::Base.new([str])

  生成新的摘要对象. 若给出了字符串参数时, 就将它添加进去(请参考update )。
Digest::Base.digest(str)

  以字符串形式返回对应于所给字符串的哈希表值. 这等价于new(str).digest。
Digest::Base.hexdigest(str)

  使用ASCII代码,把对应于所给字符串的哈希表值编码为16进制形式的字符串. 这等价于new(str).hexdigest。

方法:

dup
clone

  生成摘要对象的拷贝。
digest

  以字符串形式返回对应于当前字符串的哈希表值。在MD5中是16字节,在SHA1以及RMD160中是20字节,在SHA256中是32字节,在SHA384中是48字节,在SHA512中是64字节。
hexdigest
to_s

  使用ASCII代码,将对应于当前字符串的哈希表值编码为16进制形式的字符串。在MD5中是32字节,在SHA1以及RMD160中是40字节,在SHA256中是64字节,在SHA384中是96字节,在SHA\512中是128字节。若用ruby来写的话,就是

  def hexdigest
  digest.unpack("H*")[0]
  end

update(str)
self << str

  追加字符串。多次调用update的效果 与 先连接字符串然后一次性地调用update的效果是一样的. 也就是说, m.update(a); m.update(b) 等同于 m.update(a + b) , m << a << b 等同于 m << a + b 。
self == md

  与所给摘要对象进行比较。
self == str

  将所给字符串与digest值或hexdigest值作比较。 具体与哪个值进行比较要看所给字符串的长度而定。
包含了RFC1321中提到的RSA Data Security, Inc. 的 MD5 Message-Digest Algorithm的类。
超类:

  * Digest::Base

类方法:

Digest::MD5.new([str])
Digest::MD5.digest(str)
Digest::MD5.hexdigest(str)

  请参考Digest::Base页面。

方法:

dup
clone
digest
hexdigest
to_s
update(str)
self << str
self == md
self == str

  请参考Digest::Base页面。
包含Hans Dobbertin, Antoon Bosselaers, Bart Preneel 设计的RIPEMD-160哈希表函数的类。
超类:

  * Digest::Base

类方法:

Digest::RMD160.new([str])
Digest::RMD160.digest(str)
Digest::RMD160.hexdigest(str)

  请参考Digest::Base页面。

方法:

dup
clone
digest
hexdigest
to_s
update(str)
self << str
self == md
self == str

  请参考Digest::Base页面。