Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > irb/cmd/subirbライブラリ > IRB::ExtendCommand::Foregroundクラス

class IRB::ExtendCommand::Foreground + IRB::ExtendCommand::Nop + Object + Kernel

クラスの継承リスト: IRB::ExtendCommand::Foreground < IRB::ExtendCommand::Nop < Object < Kernel < BasicObject

要約

irb 中の irb_fg コマンドのための拡張を定義したクラスです。

特異メソッド

execute(conf, *opts) -> ()

コマンドを実行します。ユーザが直接使用するものではありません。

[PARAM] conf:
IRB::Context オブジェクトを指定します。
[PARAM] opts:
irb 中でコマンドに渡す引数を指定します。
new(conf) -> IRB::ExtendCommand::Nop

自身を初期化します。ユーザが直接使用するものではありません。

[PARAM] conf:
IRB::Context オブジェクトを指定します。
new -> Object

Objectクラスのインスタンスを生成して返します。

some = Object.new
p some #=> #<Object:0x2b696d8>

インスタンスメソッド

self !~ other -> bool

自身が other とマッチしない事を判定します。

self#=~(obj) を反転した結果と同じ結果を返します。

[PARAM] other:
判定するオブジェクトを指定します。

[SEE_ALSO] Object#=~

self == other -> bool

オブジェクトと other が等しければ真を返します。

このメソッドは各クラスの性質に合わせて再定義すべきです。 多くの場合、オブジェクトの内容が等しければ真を返すように (同値性を判定するように)再定義されることが期待されています。

デフォルトでは equal? と同じオブジェクト の同一性判定になっています。

[PARAM] other:
比較するオブジェクトです。
p("foo" == "bar") #=> false
p("foo" == "foo") #=> true

p(4 == 4) #=> true
p(4 == 4.0) #=> true

[SEE_ALSO] Object#equal?,Object#eql?

self === other -> bool

メソッド Object#== の別名です。 case 式で使用されます。このメソッドは case 式での振る舞いを考慮して、 各クラスの性質に合わせて再定義すべきです。

一般的に所属性のチェックを実現するため適宜再定義されます。

when 節の式をレシーバーとして === を呼び出すことに注意してください。

また Enumerable#grep でも使用されます。

[PARAM] other:
比較するオブジェクトです。
age = 12
result =
case age
when 0 .. 2
  "baby"
when 3 .. 6
  "little child"
when 7 .. 12
  "child"
when 13 .. 18
  "youth"
else
  "adult"
end

puts result #=> "child"

def check arg
  case arg
  when /ruby(?!\s*on\s*rails)/i
    "hit! #{arg}"
  when String
    "Instance of String class. But don't hit."
  else
    "unknown"
  end
end

puts check([]) #=> unknown
puts check("mash-up in Ruby on Rails") #=> instance of String class. But not hit...
puts check("<Ruby's world>") #=> hit! <Ruby's world>

[SEE_ALSO] Object#==, Range#===, Module#===, Enumerable#grep

self =~ other -> nil

右辺に正規表現オブジェクトを置いた正規表現マッチ obj =~ /RE/ をサポートするためのメソッドです。 常に nil を返します。

この定義により、=~ が再定義されたオブジェクトでは正常にマッチを行い、 それ以外のものは nil を返すようになります。

[PARAM] other:
任意のオブジェクトです。結果に影響しません。
obj = 'regexp'
p(obj =~ /re/) #=> 0

obj = nil
p(obj =~ /re/) #=> nil

[SEE_ALSO] String#=~

send(name, *args) -> object
send(name, *args) { .... } -> object
__send__(name, *args) -> object
__send__(name, *args) { .... } -> object

オブジェクトのメソッド name を args を引数に して呼び出し、メソッドの実行結果を返します。

ブロック付きで呼ばれたときはブロックもそのまま引き渡します。

send が再定義された場合に備えて別名 __send__ も 用意されており、ライブラリではこちらを使うべきです。また __send__ は再定義すべきではありません。

send, __send__ は、メソッドの呼び出し制限 にかかわらず任意のメソッドを呼び出せます。 クラス/メソッドの定義/呼び出し制限 も参照してください。

[PARAM] name:
文字列かSymbol で指定するメソッド名です。
[PARAM] args:
呼び出すメソッドに渡す引数です。
p -365.send(:abs) #=> 365
p "ruby".send(:sub,/./,"R") #=> "Ruby"


class Foo
  def foo() "foo" end
  def bar() "bar" end
  def baz() "baz" end
end

# 任意のキーとメソッド(の名前)の関係をハッシュに保持しておく
# レシーバの情報がここにはないことに注意
methods = {1 => :foo,
  2 => :bar,
  3 => :baz}

# キーを使って関連するメソッドを呼び出す
# レシーバは任意(Foo クラスのインスタンスである必要もない)
p Foo.new.send(methods[1])      # => "foo"
p Foo.new.send(methods[2])      # => "bar"
p Foo.new.send(methods[3])      # => "baz"

[SEE_ALSO] Object#method, Kernel.#eval, Proc, Method

_dump(limit) -> String

Marshal.#dump において出力するオブジェクトがメソッド _dump を定義している場合には、そのメソッドの結果が書き出されます。

バージョン1.8.0以降ではObject#marshal_dump, Object#marshal_loadの使用 が推奨されます。 Marshal.dump するオブジェクトが _dump と marshal_dump の両方の メソッドを持つ場合は marshal_dump が優先されます。

メソッド _dump は引数として再帰を制限するレベル limit を受 け取り、オブジェクトを文字列化したものを返します。

インスタンスがメソッド _dump を持つクラスは必ず同じフォー マットを読み戻すクラスメソッド _load を定義する必要があり ます。_load はオブジェクトを表現した文字列を受け取り、それ をオブジェクトに戻したものを返す必要があります。

[PARAM] limit:
再帰の制限レベルを表す整数です。
[RETURN]
オブジェクトを文字列化したものを返すように定義すべきです。
class Foo
  def initialize(arg)
    @foo = arg
  end
  def _dump(limit)
    Marshal.dump(@foo, limit)
  end
  def self._load(obj)
    p obj
    Foo.new(Marshal.load(obj))
  end
end
foo = Foo.new(['foo', 'bar'])
p foo                      #=> #<Foo:0xbaf234 @foo=["foo", "bar"]>
dms = Marshal.dump(foo)
p dms                      #=> "\004\bu:\bFoo\023\004\b[\a\"\bfoo\"\bbar"
result = Marshal.load(dms) #=> "\004\b[\a\"\bfoo\"\bbar" # self._load の引数
p result                   #=> #<Foo:0xbaf07c @foo=["foo", "bar"]>

インスタンス変数の情報は普通マーシャルデータに含まれるので、上例 のように _dump を定義する必要はありません(ただし _dump を定義すると インスタンス変数の情報は dump されなくなります)。 _dump/_load はより高度な制御を行いたい場合や拡張ライブラリで定義し たクラスのインスタンスがインスタンス変数以外に情報を保持する場合に 利用します。(例えば、クラス Time は、_dump/_load を定義して います)

[SEE_ALSO] Object#marshal_dump,Object#marshal_load

class -> Class

レシーバのクラスを返します。

p "ruby".class #=> String
p 999999999999999.class #=> Bignum
p ARGV.class #=> Array
p self.class #=> Object
p Class.class #=> Class
p Kernel.class #=> Module

[SEE_ALSO] Class#superclass,Object#kind_of?,Object#instance_of?

clone -> object
dup -> object

オブジェクトの複製を作成して返します。

dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成します。

clone や dup は浅い(shallow)コピーであることに注意してください。後述。

[EXCEPTION] TypeError:
TrueClass, FalseClass, NilClass, Symbol, そして Numeric クラスのインスタンスなど一部の オブジェクトを複製しようとすると発生します。
obj = "string"
obj.taint
def obj.fuga
end
obj.freeze

p(obj.equal?(obj))          #=> true
p(obj == obj)               #=> true
p(obj.tainted?)             #=> true
p(obj.frozen?)              #=> true
p(obj.respond_to?(:fuga))   #=> true

obj_c = obj.clone

p(obj.equal?(obj_c))        #=> false
p(obj == obj_c)             #=> true
p(obj_c.tainted?)           #=> true
p(obj_c.frozen?)            #=> true
p(obj_c.respond_to?(:fuga)) #=> true

obj_d = obj.dup

p(obj.equal?(obj_d))        #=> false
p(obj == obj_d)             #=> true
p(obj_d.tainted?)           #=> true
p(obj_d.frozen?)            #=> false
p(obj_d.respond_to?(:fuga)) #=> false

[SEE_ALSO] Object#initialize_copy

深いコピーと浅いコピー

clone や dup はオブジェクト自身を複製するだけで、オブジェクトの指し ている先(たとえば配列の要素など)までは複製しません。これを浅いコピー(shallow copy)といいます。

深い(deep)コピーが必要な場合には、 Marshalモジュールを利用して

Marshal.load(Marshal.dump(obj))

このように複製を作成する方法があります。ただしMarshal出来ないオブジェクトが 含まれている場合には使えません。

obj = ["a","b","c"]

obj_d = obj.dup
obj_d[0] << "PLUS"

p obj   #=> ["aPLUS", "b", "c"]
p obj_d #=> ["aPLUS", "b", "c"]

obj_m = Marshal.load(Marshal.dump(obj))
obj_m[1] << "PLUS"

p obj   #=> ["aPLUS", "b", "c"]
p obj_m #=> ["aPLUS", "bPLUS", "c"]
display(out = $stdout) -> nil

オブジェクトを out に出力します。

以下のように定義されています。

class Object
  def display(out = $stdout)
    out.print self.to_s
    nil
  end
end
[PARAM] out:
出力先のIOオブジェクトです。指定しない場合は標準出力に出力されます。
[RETURN]
nil を返します。
Object.new.display #=> #<Object:0xbb0210>

[SEE_ALSO] $stdout

to_enum(method = :each, *args) -> Enumerator
enum_for(method = :each, *args) -> Enumerator

Enumerator.new(self, method, *args) を返します。

[PARAM] method:
メソッド名の文字列かシンボルです。
[PARAM] args:
呼び出すメソッドに渡される引数です。
[EXCEPTION] NameError:
存在しないメソッド名を指定すると発生します。
str = "xyz"

enum = str.enum_for(:each_byte)
p(a = enum.map{|b| '%02x' % b }) #=> ["78", "79", "7a"]

# protects an array from being modified
a = [1, 2, 3]
p(a.to_enum) #=> #<Enumerator: [1, 2, 3]:each>

[SEE_ALSO] Enumerator

eql?(other) -> bool

オブジェクトと other が等しければ真を返します。Hash で二つのキー が等しいかどうかを判定するのに使われます。

このメソッドは各クラスの性質に合わせて再定義すべきです。 多くの場合、 == と同様に同値性の判定をするように再定義されていますが、 適切にキー判定ができるようにより厳しくなっている場合もあります。

デフォルトでは equal? と同じオブジェクト の同一性判定になっています。

このメソッドを再定義した時には Object#hash メソッ ドも再定義しなければなりません。

[PARAM] other:
比較するオブジェクトです。
p("foo".eql?("bar")) #=> false
p("foo".eql?("foo")) #=> true

p(4.eql?(4)) #=> true
p(4.eql?(4.0)) #=> false

[SEE_ALSO] Object#hash,Object#equal?,Object#==

equal?(other) -> bool

other が self 自身の時、真を返します。

二つのオブジェクトが同一のものかどうか調べる時に使用します。 このメソッドを再定義してはいけません。

お互いのObject#object_idが一致する かどうかを調べます。

[PARAM] other:
比較するオブジェクトです。
p("foo".equal?("bar")) #=> false
p("foo".equal?("foo")) #=> false

p(4.equal?(4)) #=> true
p(4.equal?(4.0)) #=> false

p(:foo.equal? :foo) #=> true

[SEE_ALSO] Object#object_id,Object#==,Object#eql?,Symbol

execute(*obj) -> IRB::Irb

指定したサブ irb に移動します。

[PARAM] obj:
移動するサブ irb を識別する以下のいずれかのオブジェクトを指定します。
  • irb インタプリタ番号
  • irb オブジェクト
  • スレッド ID
  • 各インタプリタの self (「irb(obj)」で起動した時の obj)
execute(*opts) -> ()

何もしません。サブクラスでオーバーライドして使用します。

[PARAM] opts:
irb 中でコマンドに渡す引数を指定します。
extend(*modules) -> self

引数で指定したモジュールのインスタンスメソッドを self の特異 メソッドとして追加します。

Module#include は、クラス(のインスタンス)に機能を追加します が、extend は、ある特定のオブジェクトだけにモジュールの機能を追加 したいときに使用します。

引数に複数のモジュールを指定した場合、最後 の引数から逆順に extend を行います。

[PARAM] modules:
モジュールを任意個指定します(クラスは不可)。
[RETURN]
self を返します。
module Foo
  def a
    'ok Foo'
  end
end

module Bar
  def b
    'ok Bar'
  end
end

obj = Object.new
obj.extend Foo, Bar
p obj.a #=> "ok Foo"
p obj.b #=> "ok Bar"

class Klass
  include Foo
  extend Bar
end

p Klass.new.a #=> "ok Foo"
p Klass.b     #=> "ok Bar"

extend の機能は、「特異クラスに対する Module#include」 と言い替えることもできます。 ただしその場合、フック用のメソッド が Module#extended ではなく Module#included になるという違いがあります。

# obj.extend Foo, Bar とほぼ同じ
class << obj
  include Foo, Bar
end

[SEE_ALSO] Module#extend_object,Module#include,Module#extended

freeze -> self

オブジェクトを凍結(内容の変更を禁止)します。

凍結されたオブジェクトの変更は 例外 RuntimeError を発生させます。 いったん凍結されたオブジェクトを元に戻す方法はありません。

凍結されるのはオブジェクトであり、変数ではありません。代入などで変数の指す オブジェクトが変化してしまうことは freeze では防げません。 freeze が防ぐのは、 `破壊的な操作' と呼ばれるもの一般です。変数への参照自体を凍結したい 場合は、グローバル変数なら Kernel.#trace_var が使えます。

[RETURN]
self を返します。
a1 = "foo".freeze
a1 = "bar"
p a1 #=> "bar"

a2 = "foo".freeze
a2.replace("bar")# can't modify frozen string (RuntimeError)

凍結を解除することはできませんが、Object#dup を使えばほぼ同じ内容の凍結されていない オブジェクトを得ることはできます。

a = [1].freeze
p a.frozen?     #=> true

a[0] = "foo"
p a             # can't modify frozen array (RuntimeError)

b = a.dup
p b             #=> [1]
p b.frozen?     #=> false

b[0] = "foo"
p b             #=> ["foo"]

[SEE_ALSO] Object#frozen?,Object#dup,Kernel.#trace_var

frozen? -> bool

オブジェクトが凍結(内容の変更を禁止)されているときに真を返します。

obj = "someone"
p obj.frozen? #=> false
obj.freeze
p obj.frozen? #=> true

[SEE_ALSO] Object#freeze

hash -> Fixnum

オブジェクトのハッシュ値を返します。Hash クラスでオブジェク トを格納するのに用いられています。

メソッド hash は Object#eql? と組み合わせて Hash クラスで利用されます。その際

A.eql?(B) ならば A.hash == B.hash

の関係を必ず満たしていなければいけません。eql? を再定義した時には必ずこちらも合わせ て再定義してください。

デフォルトでは、Object#object_id と同じ値を返します。 ただし、Fixnum, Symbol, String だけは組込みのハッ シュ関数が使用されます(これを変えることはできません)。

hash を再定義する場合は、一様に分布する任意の整数を返すようにします。

[RETURN]
ハッシュ値を返します。Fixnumに収まらない場合は切り捨てられます。
p self.hash #=> 21658870
p 0.hash #=> 1
p 0.0.hash #=> 0
p nil.hash #=> 4

p "ruby".hash #=> -241670986
p "ruby".hash #=> -241670986
p :ruby.hash #=> 103538
p :ruby.hash #=> 103538

[SEE_ALSO] Object#eql?,BasicObject#__id__

inspect -> String

オブジェクトを人間が読める形式に変換した文字列を返します。

組み込み関数 Kernel.#p は、このメソッドの結果を使用して オブジェクトを表示します。

puts Class.new.inspect #=> #<Class:0xbafd88>
puts Time.now.inspect #=> 2007-10-15 21:01:37 +0900

[SEE_ALSO] Kernel.#p

instance_of?(klass) -> bool

オブジェクトがクラス klass の直接のインスタンスである時真を返します。

obj.instance_of?(c) が成立する時には、常に obj.kind_of?(c) も成立します。

[PARAM] klass:
Classかそのサブクラスのインスタンスです。
class C < Object
end
class S < C
end

obj = S.new
p obj.instance_of?(S)       # true
p obj.instance_of?(C)       # false

[SEE_ALSO] Object#kind_of?,Object#class

instance_variable_defined?(var) -> bool

インスタンス変数 var が定義されていたら真を返します。

[PARAM] var:
インスタンス変数名を文字列か Symbol で指定します。
class Fred
  def initialize(p1, p2)
    @a, @b = p1, p2
  end
end
fred = Fred.new('cat', 99)
p fred.instance_variable_defined?(:@a)    #=> true
p fred.instance_variable_defined?("@b")   #=> true
p fred.instance_variable_defined?("@c")   #=> false

[SEE_ALSO] Object#instance_variable_get,Object#instance_variable_set,Object#instance_variables

instance_variable_get(var) -> object|nil

オブジェクトのインスタンス変数の値を取得して返します。

インスタンス変数が定義されていなければ nil を返します。

[PARAM] var:
インスタンス変数名を文字列か Symbol で指定します。
class Foo
  def initialize
    @foo = 1
  end
end

obj = Foo.new
p obj.instance_variable_get("@foo")     #=> 1
p obj.instance_variable_get(:@foo)      #=> 1
p obj.instance_variable_get(:@bar)      #=> nil

[SEE_ALSO] Object#instance_variable_set,Object#instance_variables,Object#instance_variable_defined?

instance_variable_set(var, value) -> object

オブジェクトのインスタンス変数 var に値 value を設定します。

インスタンス変数が定義されていなければ新たに定義されます。

[PARAM] var:
インスタンス変数名を文字列か Symbol で指定します。
[PARAM] value:
設定する値です。
[RETURN]
value を返します。
obj = Object.new
p obj.instance_variable_set("@foo", 1)  #=> 1
p obj.instance_variable_set(:@foo, 2)   #=> 2
p obj.instance_variable_get(:@foo)      #=> 2

[SEE_ALSO] Object#instance_variable_get,Object#instance_variables,Object#instance_variable_defined?

instance_variables -> [Symbol]

オブジェクトのインスタンス変数名をシンボルの配列として返します。

obj = Object.new
obj.instance_eval { @foo, @bar = nil }
p obj.instance_variables

#=> [:@foo, :@bar]

[SEE_ALSO] Object#instance_variable_get,Kernel.#local_variables,Kernel.#global_variables,Module.constants,Module#constants,Module#class_variables

irb_context -> IRB::Context

irb の現在の設定(IRB::Context)を返します。

is_a?(mod) -> bool
kind_of?(mod) -> bool

オブジェクトが指定されたクラス mod かそのサブクラスのインスタンスであるとき真を返します。

また、オブジェクトがモジュール mod をインクルードしたクラスかそのサブクラス のインスタンスである場合にも真を返します。 上記のいずれでもない場合に false を返します。

[PARAM] mod:
クラスやモジュールなど、Moduleかそのサブクラスのインスタンスです。
module M
end
class C < Object
  include M
end
class S < C
end

obj = S.new
p obj.is_a?(S)       # true
p obj.is_a?(C)       # true
p obj.is_a?(Object)  # true
p obj.is_a?(M)       # true
p obj.is_a?(Hash)    # false

[SEE_ALSO] Object#instance_of?,Module#===,Object#class

marshal_dump -> object

Marshal.#dump を制御するメソッドです。

Marshal.dump(some) において、出力するオブジェクト some がメソッド marshal_dump を 持つ場合には、その返り値がダンプされたものが Marshal.dump(some) の返り値となります。

marshal_dump/marshal_load の仕組みは Ruby 1.8.0 から導入されました。 これから書くプログラムでは _dump/_load ではなく marshal_dump/marshal_load を使うべきです。

[RETURN]
任意のオブジェクトで marshal_load の引数に利用できます。
class Foo
  def initialize(arg)
    @foo = arg
  end
  def marshal_dump
    @foo
  end
  def marshal_load(obj)
    p obj
    @foo = obj
  end
end
foo = Foo.new(['foo', 'bar'])
p foo                      #=> #<Foo:0xbaf3b0 @foo=["foo", "bar"]>
dms = Marshal.dump(foo)
p dms                      #=> "\004\bU:\bFoo[\a\"\bfoo\"\bbar"
result = Marshal.load(dms) #=> ["foo", "bar"] # marshal_load の引数
p result                   #=> #<Foo:0xbaf2ac @foo=["foo", "bar"]>

インスタンス変数の情報は普通マーシャルデータに含まれるので、 上例のように marshal_dump を定義する必要はありません (ただし marshal_dump を定義するとインスタンス変数の情報は ダンプされなくなるので、marshal_dump/marshal_load で扱う必要があります)。 marshal_dump/marshal_load はより高度な制御を行いたい場合や 拡張ライブラリで定義したクラスのインスタンスがインスタンス変数以外 に情報を保持する場合に利用します。

特に、marshal_dump/marshal_load を定義したオブジェクトは 特異メソッドが定義されていてもマーシャルできるようになります (特異メソッドの情報が自動的に dump されるようになるわけではなく、 marshal_dump/marshal_load によりそれを実現する余地があるということです)。

[SEE_ALSO] Object#marshal_load, Marshal

marshal_load(obj) -> object

Marshal.#load を制御するメソッドです。

some のダンプ結果(Marshal.dump(some)) をロードする(Marshal.load(Marshal.dump(some)))に は some がメソッド marshal_load を持っていなければなりません。 このとき、marshal_dump の返り値が marshal_load の引数に利用されます。 marshal_load 時の self は、生成されたばかり(Class#allocate されたばかり) の状態です。

marshal_dump/marshal_load の仕組みは Ruby 1.8.0 から導入されました。 これから書くプログラムでは _dump/_load ではなく marshal_dump/marshal_load を使うべきです。

[PARAM] obj:
marshal_dump の返り値のコピーです。
[RETURN]
返り値は無視されます。

[SEE_ALSO] Object#marshal_dump, Marshal

method(name) -> Method

オブジェクトのメソッド name をオブジェクト化した Method オブジェクトを返します。

[PARAM] name:
メソッド名をSymbol またはStringで指定します。
[EXCEPTION] NameError:
定義されていないメソッド名を引数として与えると発生します。
me = -365.method(:abs)
p me #=> #<Method: Fixnum#abs>
p me.call #=> 365

[SEE_ALSO] Module#instance_method,Method,Object#__send__,Kernel.#eval

methods(include_inherited = true) -> [Symbol]

そのオブジェクトに対して呼び出せるメソッド名の一覧を返します。 このメソッドは public メソッドおよび protected メソッドの名前を返します。

ただし特別に、引数が偽の時は Object#singleton_methods(false) と同じになっています。

[PARAM] include_inherited:
引数が偽の時は Object#singleton_methods(false) と同じになります。
#例1:

class Parent
  private;   def private_parent()   end
  protected; def protected_parent() end
  public;    def public_parent()    end
end

class Foo < Parent
  private;   def private_foo()   end
  protected; def protected_foo() end
  public;    def public_foo()    end
end

obj = Foo.new
class <<obj
    private;   def private_singleton()   end
    protected; def protected_singleton() end
    public;    def public_singleton()    end
end

# あるオブジェクトの応答できるメソッドの一覧を得る。
p obj.methods(false)
p obj.public_methods(false)
p obj.private_methods(false)
p obj.protected_methods(false)

#実行結果

[:protected_singleton, :public_singleton]
[:public_singleton, :public_foo]
[:private_singleton, :private_foo]
[:protected_singleton, :protected_foo]

#例2:

# あるオブジェクトの応答できるメソッドの一覧を得る。
# 自身のクラスの親クラスのインスタンスメソッドも含めるために true を指定して
# いるが、Object のインスタンスメソッドは一覧から排除している。
p obj.methods(true)           - Object.instance_methods(true)
p obj.public_methods(true)    - Object.public_instance_methods(true)
p obj.private_methods(true)   - Object.private_instance_methods(true)
p obj.protected_methods(true) - Object.protected_instance_methods(true)

#実行結果

[:protected_singleton, :public_singleton, :protected_foo, :public_foo, :protected_parent, :public_parent]
[:public_singleton, :public_foo, :public_parent]
[:private_singleton, :private_foo, :private_parent]
[:protected_singleton, :protected_foo, :protected_parent]

[SEE_ALSO] Module#instance_methods,Object#singleton_methods

nil? -> bool

レシーバが nil であれば真を返します。

p false.nil? #=> false
p nil.nil? #=> true

[SEE_ALSO] NilClass

object_id -> Integer

各オブジェクトに対して一意な整数を返します。あるオブジェクトに対し てどのような整数が割り当てられるかは不定です。

Rubyでは、(Garbage Collectされていない)アクティブなオブジェクト間で 重複しない整数(object_id)が各オブジェクトにひとつずつ割り当てられています。この メソッドはその値を返します。

TrueClass, FalseClass, NilClass, Symbol, Fixnum クラス のインスタンスなど Immutable(変更不可)なオブジェクトの一部は同じ内容ならば必ず同じ object_id になります。

これは、Immutable ならば複数の場所から参照されても`破壊的操作'による問題が発生しないので、 同じ内容のインスタンスを複数生成しないという内部実装が理由です。

p "ruby".object_id #=> 22759500
p "ruby".object_id #=> 22759400

p [].object_id #=> 22759360
p [].object_id #=> 22759340

p :ruby.object_id #=> 103538
p :ruby.object_id #=> 103538

p 11.object_id #=> 23
p 11.object_id #=> 23

p true.object_id #=> 2
p true.object_id #=> 2

[SEE_ALSO] Object#equal?,Symbol

private_methods(include_inherited = true) -> [Symbol]

そのオブジェクトが理解できる private メソッド名の一覧を返します。

[PARAM] include_inherited:
偽となる値を指定すると自身のクラスのスーパークラスで定義されたメソッドを除きます。

[SEE_ALSO] Module#private_instance_methods,Object#methods,Object#singleton_methods

protected_methods(include_inherited = true) -> [Symbol]

そのオブジェクトが理解できる protected メソッド名の一覧を返します。

[PARAM] include_inherited:
偽となる値を指定すると自身のクラスのスーパークラスで定義されたメソッドを除きます。

[SEE_ALSO] Module#protected_instance_methods,Object#methods,Object#singleton_methods

public_methods(include_inherited = true) -> [Symbol]

そのオブジェクトが理解できる public メソッド名の一覧を返します。

[PARAM] include_inherited:
偽となる値を指定すると自身のクラスのスーパークラスで定義されたメソッドを除きます。

[SEE_ALSO] Module#public_instance_methods,Object#methods,Object#singleton_methods

public_send(name, *args) -> object

オブジェクトの public メソッド name を args を引数にして呼び出し、メソッ ドの実行結果を返します。

1.public_send(:+, 2)  # => 3
[PARAM] name:
文字列かSymbol で指定するメソッド名です。
[PARAM] args:
呼び出すメソッドに渡す引数です。
[EXCEPTION] ArgumentError:
name を指定しなかった場合に発生します。
[EXCEPTION] NoMethodError:
protected メソッドや private メソッドに対して実行 した場合に発生します。
1.public_send(:puts, "hello")  # => NoMethodError

[SEE_ALSO] Object#send

respond_to?(name, include_private = false) -> bool

オブジェクトがメソッド name を持つとき真を返します。

オブジェクトが メソッド name を持つというのは、 オブジェクトが メソッド name に応答することができることをいいます。

[PARAM] name:
Symbol または文字列で指定するメソッド名です。
[PARAM] include_private:
private メソッドを確認の対象に含めるかを true か false で指定します。省略した場合は false(含めな い) を指定した事になります。
class F
  def hello
    "Bonjour"
  end
end

class D
private
  def hello
    "Guten Tag"
  end
end
list = [F.new,D.new]

list.each{|it| puts it.hello if it.respond_to?(:hello)}
#=> Bonjour

list.each{|it| it.instance_eval("puts hello if it.respond_to?(:hello, true)")}
#=> Bonjour
#   Guten Tag

[SEE_ALSO] Module#method_defined?

respond_to_missing?(symbol, include_private) -> bool

自身が symbol で表されるメソッドに対し BasicObject#method_missing で反応するつもりならば真を返します。

Object#respond_to? はメソッドが定義されていない場合、 デフォルトでこのメソッドを呼びだし問合せます。

BasicObject#method_missing を override した場合にこのメソッドも override されるべきです。

false を返します。

[PARAM] symbol:
メソッド名シンボル
[PARAM] include_private:
private method も含めたい場合に true が渡されます

[SEE_ALSO] Object#respond_to?, BasicObject#method_missing

singleton_class -> Class

レシーバの特異クラスを返します。 まだ特異クラスがなければ、新しく作成します。

レシーバが nil か true か false なら、それぞれ NilClass, TrueClass, FalseClass を返します。

[EXCEPTION] TypeError:
レシーバが Fixnum か Symbol の場合に発生します。
Object.new.singleton_class  #=> #<Class:#<Object:0xb7ce1e24>>
String.singleton_class      #=> #<Class:String>
nil.singleton_class         #=> NilClass

[SEE_ALSO] Object#class

singleton_methods(inherited_too = true) -> [Symbol]

そのオブジェクトに対して定義されている特異メソッド名 (public あるいは protected メソッド) の一覧を返します。

クラスメソッド(Classのインスタンスの特異メソッド)に関しては 引数が真のとき、スーパークラスのクラスメソッドも対象になります。

singleton_methods(false) は、Object#methods(false) と同じです。

[PARAM] inherited_too:
引数が真のとき、スーパークラスのクラスメソッドも対象になります。これが意味を持つのは self がクラスオブジェクトであるときだけです。
#例1:

Parent = Class.new

class <<Parent
  private;   def private_class_parent() end
  protected; def protected_class_parent() end
  public;    def public_class_parent() end
end

Foo = Class.new(Parent)

class <<Foo
  private;   def private_class_foo() end
  protected; def protected_class_foo() end
  public;    def public_class_foo() end
end

module Bar
  private;   def private_bar()   end
  protected; def protected_bar() end
  public;    def public_bar()    end
end

obj = Foo.new
class <<obj
  include Bar
  private;   def private_self()   end
  protected; def protected_self() end
  public;    def public_self()    end
end

# あるオブジェクトの特異メソッドの一覧を得る。
p obj.singleton_methods(false)
p obj.methods(false)
p Foo.singleton_methods(false)

#実行結果

[:protected_self, :public_self]
[:protected_self, :public_self]
[:protected_class_foo, :public_class_foo]


#例2:

# あるオブジェクトの特異メソッドの一覧を得る。
# 親クラスのクラスメソッドも含まれるよう true を指定したが、
# Object のクラスメソッドは一覧から排除している。

p obj.singleton_methods(true)
p Foo.singleton_methods(true) - Object.singleton_methods(true)

#実行結果

[:protected_self, :public_self, :protected_bar, :public_bar]
[:protected_class_foo, :public_class_foo, :protected_class_parent, :public_class_parent]

[SEE_ALSO] Object#methods,Object#extend

taint -> self

オブジェクトの「汚染マーク」をセットします。

環境変数(ENVで得られる文字列)など一部のオブジェクトは最初から汚染されています。 オブジェクトの汚染に関してはセキュリティモデルを参照してください。

$SAFE = 1

some = "puts '@&%&(#!'"
p some.tainted? #=> false
eval(some) #=> @&%&(#!

some.taint
p some.tainted? #=> true
eval(some) # Insecure operation - eval (SecurityError)

some.untaint
p some.tainted? #=> false
eval(some) #=> @&%&(#!

p ENV['OS'].tainted? #=> true

[SEE_ALSO] Object#tainted?,Object#untaint,Object#freeze

tainted? -> bool

オブジェクトの「汚染マーク」がセットされている時真を返します。

オブジェクトの汚染に関してはセキュリティモデルを参照してください。

p String.new.tainted? #=> false
p ENV['OS'].tainted? #=> true

[SEE_ALSO] Object#taint,Object#untaint

tap {|x| ... } -> self

self を引数としてブロックを評価し、self を返します。

メソッドチェインの途中で直ちに操作結果を表示するために メソッドチェインに "入り込む" ことが、このメソッドの主目的です。

(1..10)                    .tap {|x| puts "original: #{x.inspect}"}.
   to_a                    .tap {|x| puts "array: #{x.inspect}"}.
   select {|x| x % 2 == 0} .tap {|x| puts "evens: #{x.inspect}"}.
   map { |x| x * x }       .tap {|x| puts "squares: #{x.inspect}"}
to_a -> Array

オブジェクトを配列に変換した結果を返します。 デフォルトでは定義されていません。

説明のためここに記載してありますが、 このメソッドは実際には Object クラスには定義されていません。 必要に応じてサブクラスで定義すべきものです。

p( {'a'=>1}.to_a )  # [["a", 1]]
p ['array'].to_a    # ["array"]
p nil.to_a          # []

[SEE_ALSO] Object#to_ary,Kernel.#Array

to_ary -> Array

オブジェクトの Array への暗黙の変換が必要なときに内部で呼ばれます。 デフォルトでは定義されていません。

説明のためここに記載してありますが、 このメソッドは実際には Object クラスには定義されていません。 必要に応じてサブクラスで定義すべきものです。

このメソッドを定義する条件は、

  • 配列が使われるすべての場面で代置可能であるような、
  • 配列そのものとみなせるようなもの

という厳しいものになっています。

class Foo
 def to_ary
   [3,4]
 end
end

it = Foo.new
p([1,2] + it) #=> [1, 2, 3, 4]

[SEE_ALSO] Object#to_a,Kernel.#Array

to_hash -> Hash

オブジェクトの Hash への暗黙の変換が必要なときに内部で呼ばれます。 デフォルトでは定義されていません。

説明のためここに記載してありますが、 このメソッドは実際には Object クラスには定義されていません。 必要に応じてサブクラスで定義すべきものです。

このメソッドを定義する条件は、

  • ハッシュが使われるすべての場面で代置可能であるような、
  • ハッシュそのものとみなせるようなもの

という厳しいものになっています。

class Foo
 def to_hash
   {'as' => 24}
 end
end

it = Foo.new
p({:as => 12}.merge(it)) #=> {"as"=>24, :as=>12}
to_int -> Integer

オブジェクトの Integer への暗黙の変換が必要なときに内部で呼ばれます。 デフォルトでは定義されていません。

説明のためここに記載してありますが、 このメソッドは実際には Object クラスには定義されていません。 必要に応じてサブクラスで定義すべきものです。

このメソッドを定義する条件は、

  • 整数が使われるすべての場面で代置可能であるような、
  • 整数そのものとみなせるようなもの

という厳しいものになっています。

class Foo
 def to_int
   666
 end
end

it = Foo.new
p(9**9 & it) #=> 8

[SEE_ALSO] Kernel.#Integer

to_io -> IO

オブジェクトの IO への暗黙の変換が必要なときに内部で呼ばれます。 デフォルトでは定義されていません。

説明のためここに記載してありますが、 このメソッドは実際には Object クラスには定義されていません。 必要に応じてサブクラスで定義すべきものです。

このメソッドを定義する条件は、

  • IOオブジェクトが使われるすべての場面で代置可能であるような、
  • IOオブジェクトそのものとみなせるようなもの

という厳しいものになっています。

to_proc -> Proc

オブジェクトの Proc への暗黙の変換が必要なときに内部で呼ばれます。 デフォルトでは定義されていません。

説明のためここに記載してありますが、 このメソッドは実際には Object クラスには定義されていません。 必要に応じてサブクラスで定義すべきものです。

def doing
  yield
end

class Foo
 def to_proc
   Proc.new{p 'ok'}
 end
end

it = Foo.new
doing(&it) #=> "ok"
to_regexp -> Regexp

オブジェクトの Regexp への暗黙の変換が必要なときに内部で呼ばれます。 デフォルトでは定義されていません。

説明のためここに記載してありますが、 このメソッドは実際には Object クラスには定義されていません。 必要に応じてサブクラスで定義すべきものです。

このメソッドを定義する条件は、

  • 正規表現が使われるすべての場面で代置可能であるような、
  • 正規表現そのものとみなせるようなもの

という厳しいものになっています。

class Foo
 def to_regexp
   /[\d]+/
 end
end

it = Foo.new
p Regexp.union(/^at/, it) #=> /(?-mix:^at)|(?-mix:[\d]+)/
to_s -> String

オブジェクトの文字列表現を返します。

Kernel.#printKernel.#sprintf は文字列以外の オブジェクトが引数に渡された場合このメソッドを使って文字列に変換し ます。

class Foo
  def initialize num
    @num = num
  end
end
it = Foo.new(40)

puts it #=> #<Foo:0x2b69110>

class Foo
 def to_s
   "Class:Foo Number:#{@num}"
 end
end

puts it #=> Class:Foo Number:40

[SEE_ALSO] Object#to_str,Kernel.#String

to_str -> String

オブジェクトの String への暗黙の変換が必要なときに内部で呼ばれます。 デフォルトでは定義されていません。

説明のためここに記載してありますが、 このメソッドは実際には Object クラスには定義されていません。 必要に応じてサブクラスで定義すべきものです。

このメソッドを定義する条件は、

  • 文字列が使われるすべての場面で代置可能であるような、
  • 文字列そのものとみなせるようなもの

という厳しいものになっています。

class Foo
 def to_str
   'Edition'
 end
end

it = Foo.new
p('Second' + it) #=> "SecondEdition"

[SEE_ALSO] Object#to_s,Kernel.#String

trust -> self

[TODO]

オブジェクトの「untrustマーク」を取り除きます。

[SEE_ALSO] Object#untrusted?,Object#untrust

untaint -> self

オブジェクトの「汚染マーク」を取り除きます。

汚染マークを取り除くことによる危険性はプログラマが責任を負う必要が あります。

オブジェクトの汚染に関してはセキュリティモデルを参照してください。

[EXCEPTION] SecurityError:
セキュリティレベルが3以上の時にこのメソッドを使用すると発生します。

[SEE_ALSO] Object#taint,Object#tainted?

untrust -> self

[TODO]

オブジェクトの「untrustマーク」をセットします。

[SEE_ALSO] Object#trust,Object#untrusted?

untrusted? -> bool

[TODO]

オブジェクトの「untrustマーク」がセットされている時真を返します。

[SEE_ALSO] Object#trust,Object#untrust

privateメソッド

initialize(*args, &block) -> object

ユーザ定義クラスのオブジェクト初期化メソッド。

このメソッドは Class#new から新しく生成されたオブ ジェクトの初期化のために呼び出されます。他の言語のコンストラクタに相当します。 デフォルトの動作ではなにもしません。

initialize には Class#new に与えられた引数がそのまま渡されます。

サブクラスではこのメソッドを必要に応じて再定義されること が期待されています。

initialize という名前のメソッドは自動的に private に設定され ます。

[PARAM] args:
初期化時の引数です。
[PARAM] block:
初期化時のブロック引数です。必須ではありません。
class Foo
  def initialize name
    puts "initialize Foo"
    @name = name
  end
end

class Bar < Foo
  def initialize name, pass
    puts "initialize Bar"
    super name
    @pass = pass
  end
end

it = Bar.new('myname','0500')
p it
#=> initialize Bar
#   initialize Foo
#   #<Bar:0x2b68f08 @name="myname", @pass="0500">

[SEE_ALSO] Class#new

initialize_copy(obj) -> object

(拡張ライブラリによる) ユーザ定義クラスのオブジェクトコピーの初期化メソッド。

このメソッドは self を obj の内容で置き換えます。ただ し、self のインスタンス変数や特異メソッドは変化しません。 Object#clone, Object#dupの内部で使われています。

initialize_copy は、Ruby インタプリタが知り得ない情報をコピーするた めに使用(定義)されます。例えば C 言語でクラスを実装する場合、情報 をインスタンス変数に保持させない場合がありますが、そういった内部情 報を initialize_copy でコピーするよう定義しておくことで、dup や clone を再定義する必要がなくなります。

デフォルトの Object#initialize_copy は、 freeze チェックおよび型のチェックを行い self を返すだけのメソッドです。

initialize_copy という名前のメソッドは 自動的に private に設定されます。

[EXCEPTION] TypeError:
レシーバが freeze されているか、obj のクラスがレシーバ のクラスと異なる場合に発生します。

[SEE_ALSO] Object#clone,Object#dup

以下に例として、dup や clone がこのメソッドをどのように利用しているかを示します。

obj.dup は、新たに生成したオブジェクトに対して initialize_copy を呼び

obj2 = obj.class.allocate
obj2.initialize_copy(obj)

obj2 に対してさらに obj の汚染状態、インスタンス変数、ファイナライ ザをコピーすることで複製を作ります。 obj.clone は、さらに 特異メソッドのコピーも行います。

obj = Object.new
class <<obj
  attr_accessor :foo
  def bar
    :bar
  end
end

def check(obj)
  puts "instance variables: #{obj.inspect}"
  puts "tainted?: #{obj.tainted?}"
  print "singleton methods: "
  begin
    p obj.bar
  rescue NameError
    p $!
  end
end

obj.foo = 1
obj.taint

check Object.new.send(:initialize_copy, obj)
        #=> instance variables: #<Object:0x4019c9d4>
        #   tainted?: false
        #   singleton methods: #<NoMethodError: ...>
check obj.dup
        #=> instance variables: #<Object:0x4019c9c0 @foo=1>
        #   tainted?: true
        #   singleton methods: #<NoMethodError: ...>
check obj.clone
        #=> instance variables: #<Object:0x4019c880 @foo=1>
        #   tainted?: true
        #   singleton methods: :bar
remove_instance_variable(name) -> object

オブジェクトからインスタンス変数 name を取り除き、そのインス タンス変数に設定されていた値を返します。

[PARAM] name:
削除するインスタンス変数の名前をシンボルか文字列で指定します。
[EXCEPTION] NameError:
オブジェクトがインスタンス変数 name を持たない場合に発生します。
class Foo
  def foo
    @foo = 1
    p remove_instance_variable(:@foo) #=> 1
    p remove_instance_variable(:@foo) # instance variable @foo not defined (NameError)
  end
end
Foo.new.foo

[SEE_ALSO] Module#remove_class_variable,Module#remove_const

モジュール関数

Array(arg) -> Array

引数を配列(Array)に変換した結果を返します。

arg.to_ary と arg.to_a をこの順に呼び出して、返ってきた配列を変換結果とします。

arg に to_ary, to_a のいずれのメソッドも定義されていない場合は 一要素の配列 [arg] を返します。

[PARAM] arg:
変換対象のオブジェクトです。
[EXCEPTION] TypeError:
to_ary, to_a の返り値が配列でなければ発生します
p Array({:it => 3}) #=> [[:it, 3]]
p Array(nil) #=> []
p Array("fefe") #=> ["fefe"]

[SEE_ALSO] Object#to_a,Object#to_ary,Array

Complex(r, i = 0) -> Complex
Complex(s) -> Complex

実部が r、虚部が i である Complex クラスのオブジェクトを生成します。

[PARAM] r:
生成する複素数の実部。
[PARAM] i:
生成する複素数の虚部。省略した場合は 0 です。
[PARAM] s:
生成する複素数を表す文字列。
[EXCEPTION] ArgumentError:
変換できないオブジェクトを指定した場合に発生します。

例:

Complex(1)       # => (1+0i)
Complex(1, 2)    # => (1+2i)
Complex('1+1i')  # => (1+1i)
Complex('1+1j')  # => (1+1i)
# Complex.polar(10, 10) と同一。
Complex('10@10') # => (-8.390715290764524-5.440211108893697i)
Complex('_')     # => ArgumentError

r にも i にも複素数と解釈されるオブジェクトを指定した場合には、 Complex(a, b) を a+bi として計算した Complex オブジェクトを返しま す。

Complex('1+1i', '2+3i')                          # => (-2+3i)
Complex('1+1i') + Complex('2+3i') * Complex('i') # => (-2+3i)

[SEE_ALSO] Complex.rectComplex.rectangular

[注意] Complex.new、Complex.new! は 1.9 系では廃止されました。

Float(arg) -> Float

引数を浮動小数点数(Float)に変換した結果を返します。

引数が数値の場合は素直に変換し、文字列の場合 は整数や浮動小数点数と見なせるもののみ変換します。

メソッド Float は文字列に対し String#to_f よりも厳密な変換を行います。

[PARAM] arg:
変換対象のオブジェクトです。
[EXCEPTION] ArgumentError:
整数や浮動小数点数と見なせない文字列を引数に指定した場合に発生します。
[EXCEPTION] TypeError:
nil またはメソッド to_f を持たないオブジェクトを引数に指定したか、 to_f が浮動小数点数を返さなかった場合に発生します。
p Float(4)            #=> 4.0
p Float(4_000)        #=> 4000.0
p Float(9.88)         #=> 9.88

p Float(Time.gm(1986)) #=> 504921600.0
p Float(Object.new)   # cannot convert Object into Float (TypeError)
p Float(nil)          # cannot convert nil into Float (TypeError)

p Float("10")         #=> 10.0
p Float("10e2")       #=> 1000.0
p Float("1e-2")       #=> 0.01
p Float(".1")         #=> 0.1

p Float("nan")        # invalid value (ArgumentError)
p Float("INF")        # invalid value (ArgumentError)
p Float("-Inf")       # invalid value (ArgumentError)
p Float(("10" * 1000)) #=> Infinity
p Float("0xa.a")      # invalid value (ArgumentError)
p Float(" \n10\s \t") #=> 10.0 # 空白類は無視される
p Float("")           # invalid value (ArgumentError)

[SEE_ALSO] String#to_f,Float

Integer(arg) -> Integer

引数を整数(Fixnum,Bignum)に変換した結果を返します。

引数が数値の場合は直接変換し(小数点以下切り落とし)、 文字列の場合は、進数を表す接頭辞を含む整数表現とみなせる文字列のみ 変換します。

数値と文字列以外のオブジェクトに対しては arg.to_int, arg.to_i を この順に使用して変換します。

[PARAM] arg:
変換対象のオブジェクトです。
[EXCEPTION] ArgumentError:
整数と見なせない文字列を引数に指定した場合に発生します。
[EXCEPTION] TypeError:
メソッド to_int, to_i を持たないオブジェクトを引数に指定したか、to_int, to_i が整数(Integerのサブクラス)を返さなかった場合に発生します。
[EXCEPTION] TypeError:
引数に nil を指定した場合に発生します。
p Integer(4)          #=> 4
p Integer(4_000)      #=> 4000
p Integer(9.88)       #=> 9

p Integer(nil)        # can't convert nil into Integer (TypeError)
p Integer(Object.new) # cannot convert Object into Integer (TypeError)

p Integer("10")       #=> 10
p Integer("0d10")     #=> 10
p Integer("010")      #=> 8
p Integer("0o10")     #=> 8
p Integer("0x10")     #=> 16
p Integer("0b10")     #=> 2
p Integer(" \n10\t ") #=> 10 # 空白類は無視される
p Integer("hoge")     # `Integer': invalid value for Integer: "hoge" (ArgumentError)
p Integer("")         # `Integer': invalid value for Integer: "" (ArgumentError)

[SEE_ALSO] String#hex,String#oct,String#to_i,Integer

Rational(x, y = 1) -> Rational

引数を有理数(Rational)に変換した結果を返します。

[PARAM] x:
変換対象のオブジェクトです。
[PARAM] y:
変換対象のオブジェクトです。省略した場合は x だけを用いて Rational オブジェクトを作成します。
[EXCEPTION] ArgumentError:
変換できないオブジェクトを指定した場合に発生します。

引数 x、y の両方を指定した場合、x/y した Rational オブジェクトを 返します。

Rational("1/3")           # => (1/3)
Rational(1, 3)            # => (1/3)
Rational("0.1", "0.3")    # => (1/3)
Rational(Complex(1,2), 2) # => ((1/2)+(1/1)*i)

ただし、1.8系とは異なり、Rational オブジェクトは常に既約(それ以上 約分できない状態)である事に注意してください。

Rational(2, 6)         # => (1/3)
Rational(1, 3) * 3     # => (1/1)

引数に文字列を指定する場合、以下のいずれかの形式で指定します。

  • "1/3" のような分数の形式
  • "0.3" のような10進数の形式
  • "0.3E0" のような x.xEn の形式
  • 数字をアンダースコアで繋いだ形式

"1.2/3" のように、分子を実数にする事も可能ですが、分母には指定できませ ん。また、Kernel.#Integer とは違い "0x10" のような進数を表す接頭 辞を含めた指定は行えません。

例:

Rational("1/3")        # => (1/3)
Rational("0.3")        # => (3/10)
Rational('0.3E0')      # => (3/10)
Rational('0.1E1/3')    # => (1/3)
Rational('1.2/3')      # => (2/5)
Rational('1/3.1')      # => ArgumentError
Rational('3.0', '3.0') # => (1/1)
Rational('3/3', '3/3') # => (1/1)
Rational('1_234_567')  # => (1234567/1)
Rational(" \n10\t ")   # => (10/1) # 空白類は無視される
Rational("0x10")       # => ArgumentError

引数に変換できないオブジェクトを指定した場合には ArgumentError が 発生します。

Rational(Object.new)   # => ArgumentError
Rational("")           # => ArgumentError
Rational(nil)          # => ArgumentError

また、Rational('0.3') と Rational(0.3) は異なるオブジェクトを返す事に注 意してください。前者は正確に 3/10 ですが、後者はそうではありません。

Rational('0.3')        # => (3/10)
Rational(0.3)          # => (5404319552844595/18014398509481984)

[SEE_ALSO] Rational

String(arg) -> String

引数を文字列(String)に変換した結果を返します。

arg.to_s を呼び出して文字列に変換します。 arg が文字列の場合、何もせず arg を返します。

[PARAM] arg:
変換対象のオブジェクトです。
[EXCEPTION] TypeError:
to_s の返り値が文字列でなければ発生します。
class Foo
 def to_s
   "hogehoge"
 end
end

arg = Foo.new
p String(arg) #=> "hogehoge"

[SEE_ALSO] Object#to_s,String

__method__ -> Symbol | nil
__callee__ -> Symbol | nil

現在のメソッド名を返します。 メソッドの外で呼ばれると nil を返します。

def foo
  p __method__
end
foo #=> :foo
p __method__ #=> nil
`command` -> String

command を外部コマンドとして実行し、その標準出力を文字列として 返します。このメソッドは `command` の形式で呼ばれます。

引数 command に対しダブルクォートで囲まれた文字列と同様の解釈と式展開を行った後、 コマンドとして実行します。 コマンドは評価されるたびに実行されます。コマンドの終了ステータスを得るには、$? を参照します。

コマンドの出力を得る必要がなく、単にコマンドを実行したいだけなら Kernel.#system を使います。特に端末を制御するコマンドでは `command` は失敗するかもしれません。

リテラル/コマンド出力 も参照。

[PARAM] command:
コマンドとして実行する引数です。そのまま評価されるのではなく、 ダブルクォート文字列と同様のバックスラッシュ記法の解釈と式展開が行われます。
[RETURN]
コマンドの出力を文字列で返します。
[EXCEPTION] Errno::EXXX:
コマンドを実行できないときや失敗した場合に発生します。
puts `ruby -v` #=> ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
puts $?.inspect #=> #<Process::Status: pid=3580,exited(0)>

[SEE_ALSO] Kernel.#system,Kernel.#exec,Kernel.#spawn

abort(message = $!.message) -> ()

Ruby プログラムをエラーメッセージ付きで終了します。終了ステータスは 1 固定です。

このメソッドと Kernel.#exit との違いは、プログラムの終了ステー タスが 1 (正確にはCレベルの定数 EXIT_FAILURE の値)固定であることと、 引数を省略した呼び出し時に $! が nil でなければその例外の メッセージを標準エラー出力 $stderr に出力することです。

引数 message を指定すると SystemExit クラスの Exception#message に message を設定し て標準エラー出力に出力します。

[PARAM] message:
エラーメッセージ文字列です。
puts 'start'
begin
  puts 'start1...'
  abort "error1"
rescue SystemExit => err
  puts "end1 with #{err.inspect}"
end

begin
  puts 'start2...'
  $! = RuntimeError.new
  abort
ensure
  puts 'end2...'
end
puts 'end' #実行されない

#=> start
#   start1...
#   end1 with #<SystemExit: error1>
#   start2...
#   end2...
#終了ステータス:1
#(標準エラー出力)
#=> error1
#   ..:12: RuntimeError (RuntimeError)

[SEE_ALSO] Kernel.#exit,Kernel.#exit!

at_exit { ... } -> Proc

与えられたブロックをインタプリタ終了時に実行します。

at_exitがメソッドである点を除けば、END ブロックによる終了 処理の登録と同等です。登録した処理を取り消すことはできません。 終了処理も参照してください。

[RETURN]
登録した処理を Proc オブジェクトで返します。
3.times do |i|
  at_exit{puts "at_exit#{i}"}
end
END{puts "END"}
at_exit{puts "at_exit"}
puts "main_end"

#=> main_end
#   at_exit
#   END
#   at_exit2
#   at_exit1
#   at_exit0

[SEE_ALSO] 制御構造/END

autoload(const_name, feature) -> nil

定数 const_name を最初に参照した時に feature を Kernel.#require するように設定します。

const_name には、 "::" 演算子を含めることはできません (ネストした定数を指定する方法は後述)。

[PARAM] const_name:
定数をString または Symbol で指定します。
[PARAM] feature:
require と同様な方法で autoload する対象を指定します。
[EXCEPTION] LoadError:
featureのロードに失敗すると発生します。
------- /tmp/foo.rb ---------
class Bar
end
----- end of /tmp/foo.rb ----

autoload :Bar, '/tmp/foo'
p Bar #=> Bar

ネストした定義内の定数

const_name には、 "::" 演算子を含めることはできないので、 Kernel.#autoload ではトップレベルの定数しか指定できません。

Module#autoload と組み合わせることで、任意のクラス/モジュールの定数を autoload できます。 やはりconst_name に "::" 演算子を含めることはで きませんが、以下のように定義する事ができます。

------- /tmp/foo.rb ---------
class Foo
  class Bar
  end
end
----- end of /tmp/foo.rb ----

class Foo
  autoload :Bar, '/tmp/foo'
end
p Foo::Bar #=> Foo::Bar

あるいは、以下のようにもできます。

class Foo
end
Foo.autoload :Bar, '/tmp/foo'
p Foo::Bar #=> Foo::Bar

以下のように、autoload したライブラリがネストした定数を定義しない場 合、一見、正常に動作しているように見えるので注意が必要です(警告メッ セージが出ています)。

------- /tmp/bar.rb ---------
class Bar
end
----- end of /tmp/bar.rb ----

class Foo
  autoload :Bar, '/tmp/bar.rb'
end
p Foo::Bar
p Foo.autoload?(:Bar)
#=> -:4: warning: toplevel constant Bar referenced by Foo::Bar
#   Bar
#   nil

これは以下のようにネストせずに定義したのと同じことです。

class Foo
end
class Bar
end
p Foo::Bar
#=> -:5: warning: toplevel constant Bar referenced by Foo::Bar
#   Bar

[SEE_ALSO] Kernel.#autoload?,Module#autoload,Kernel.#require

autoload?(const_name) -> String | nil

const_name が Kernel.#autoload 設定されているか調べます。

autoload 設定されていて、autoload 定数がまだ定義されてない(ロードされていない) ときにそのパス名を返します。

autoload 設定されていないか、ロード済みなら nil を返します。

[PARAM] const_name:
定数をString または Symbol で指定します。
------- /tmp/foo.rb ---------
class Foo
  class Bar
  end
end
----- end of /tmp/foo.rb ----

class Foo
end
p Foo.autoload?(:Bar)         #=> nil
Foo.autoload :Bar, '/tmp/foo'
p Foo.autoload?(:Bar)         #=> "/tmp/foo"
p Foo::Bar                    #=> Foo::Bar
p Foo.autoload?(:Bar)         #=> nil

[SEE_ALSO] Kernel.#autoload

binding -> Binding

変数・メソッドなどの環境情報を含んだ Binding オブジェクトを 生成して返します。通常、Kernel.#eval の第二引数として使います。

def foo
  a = 1
  binding
end

eval("p a", foo)  #=> 1

[SEE_ALSO] Kernel.#eval,Kernel::TOPLEVEL_BINDING

block_given? -> bool
iterator? -> bool

メソッドにブロックが与えられていれば真を返します。

このメソッドはカレントコンテキストにブロックが与えられているかを調べるので、 メソッド内部以外で使っても単に false を返します。

iterator? は (ブロックが必ずイテレートするとはいえないので)推奨されていないの で block_given? を使ってください。

def check
  if block_given?
    puts "Block is given."
  else
    puts "Block isn't given."
  end
end
check{} #=> Block is given.
check #=> Block isn't given.
caller(level_num = 1) -> [String] | nil

level_num 段上の呼び出し元の情報を $@ の形式のバックトレース(文字列の配列)として返します。

トップレベルでは空の配列を返します。caller の戻り値を $@ に代入することで 例外の発生位置を設定できます。

指定した level_num 段上が存在しない場合は nil を返します。

[PARAM] level_num:
long の範囲を超えない正の整数でスタックレベルを指定します。

[SEE_ALSO] Kernel.#set_trace_func,Kernel.#raise

def foo
  p caller(0)
  p caller(1)
  p caller(2)
  p caller(3)
  p caller(4)
end

def bar
  foo
end

bar

#=> ["-:2:in `foo'", "-:10:in `bar'", "-:13:in `<main>'"]
#   ["-:10:in `bar'", "-:13:in `<main>'"]
#   ["-:13:in `<main>'"]
#   []
#   nil

以下の関数は、caller の要素から [ファイル名, 行番号, メソッド名] を取り出して返します。

def parse_caller(at)
  if /^(.+?):(\d+)(?::in `(.*)')?/ =~ at
    file = $1
    line = $2.to_i
    method = $3
    [file, line, method]
  end
end

def foo
  p parse_caller(caller.first)
end

def bar
  foo
  p parse_caller(caller.first)
end

bar
p parse_caller(caller.first)

#=> ["-", 15, "bar"]
#   ["-", 19, nil]
#   nil

以下は、$DEBUG が真の場合に役に立つ debug 関数 のサンプルです。

$DEBUG = true

def debug(*args)
  p [caller.first, *args] if $DEBUG
end

debug "debug information"

#=> ["-:7", "debug information"]
catch {|tag| .... } -> object
catch(tag) {|tag| .... } -> object

Kernel.#throwとの組み合わせで大域脱出を行います。 catch はブロックを実行します。

ブロックの実行中に tag と同一のオブジェクトを引数とする Kernel.#throw が行われた 場合は、その throw の第二引数を戻り値として、ブロックの実行を終了します。

主にネストしたループから一気に脱出するのに使用します。

引数を省略した場合、タグとなるオブジェクトが内部で生成され、ブロックパラメータ tag に 渡されます。

[PARAM] tag:
タグとなる任意のオブジェクトです。
[RETURN]
ブロックの返り値か、対応するthrowの第二引数を返り値として返します。
result = catch do |tag|
  for i in 1..2
    for j in 1..2
      for k in 1..2
        throw tag, k
      end
    end
  end
end

p result #=> 1

[SEE_ALSO] Kernel.#throw

eval(expr) -> object
eval(expr, bind, fname = "(eval)", lineno = 1) -> object

文字列 expr を Ruby プログラムとして評価してその結果を返しま す。第2引数に Binding オブジェクトを与えた場合、 そのオブジェクトを生成したコンテキストで文字列を評価します。

expr の中のローカル変数の扱いはブロックの場合と同じです。すなわち、eval 実行前に補足されていた変数は eval 実行後にブロック外に持ち出せます。

fname と lineno が与えられた場合には、ファイル fname の行番号 lineno から文字列 expr が書かれているかのように コンパイルされます。スタックトレースの表示などを差し替えることが できます。

bind によらずに特定のオブジェクトのコンテキストで expr を評価したい場合、 Module#module_eval, BasicObject#instance_eval が使えます。

[PARAM] expr:
評価する文字列です。
[PARAM] bind:
評価コンテキストです。
[PARAM] fname:
スタックトレースに表示するファイル名です。
[PARAM] lineno:
文字列 expr が書かれていると想定する先頭の行番号を整数で指定します。
a = nil
eval('a = RUBY_RELEASE_DATE')
p a #=> "2007-03-13"

eval('def fuga;p 777 end')
fuga #=> 777

eval('raise RuntimeError', binding, 'XXX.rb', 4)
#=> XXX.rb:4: RuntimeError (RuntimeError)
#       from ..:9

[SEE_ALSO] Kernel.#binding,Module#module_eval,BasicObject#instance_eval,Object#method,Object#send

exec(command, options={}) -> ()
exec(env, command, options={}) -> ()

引数で指定されたコマンドを実行します。

プロセスの実行コードはそのコマンド(あるいは shell)になるので、 起動に成功した場合、このメソッドからは戻りません。

引数の解釈

この形式では command が shell のメタ文字

  * ? {} [] <> () ~ & | \ $ ; ' ` " \n

を含む場合、shell 経由で実行されます。 そうでなければインタプリタから直接実行されます。

[PARAM] command:
コマンドを文字列で指定します。
[PARAM] env:
更新する環境変数を表す Hash
[PARAM] options:
オプションパラメータ Hash
[EXCEPTION] Errno::EXXX:
起動に失敗し、ruby インタプリタに制御が戻った場合に発生します。
# a.rb
puts '実行前'
exec 'echo "実行中"'
puts '実行後'

上記のスクリプトを実行すると以下のようになります。

$ ruby a.rb
実行前
実行中
# '実行後' は表示されない
exec(program, *args, options={}) -> ()
exec(evn, program, *args, options={}) -> ()

引数で指定されたコマンドを実行します。

プロセスの実行コードはそのコマンド(あるいは shell)になるので、 起動に成功した場合、このメソッドからは戻りません。

この形式では、常に shell を経由せずに実行されます。

exec(3) でコマンドを実行すると、 元々のプログラムの環境をある程度(ファイルデスクリプタなど)引き継ぎます。 Hash を options として渡すことで、この挙動を変更できます。 詳しくは Kernel.#spawn を参照してください。

引数の解釈

この形式で呼び出した場合、空白や shell のメタキャラクタも そのまま program の引数に渡されます。 先頭の引数が2要素の配列であった場合、第1要素の文字列が実際に 起動するプログラムのパスであり、第2要素が「みせかけ」のプロ グラム名になります。 また、第1要素はフルパスで指定しなくても環境変数 PATH から探します。

[PARAM] program:
文字列か2要素の配列を指定します。
[PARAM] args:
渡される引数です。0 個以上の文字列を指定します。
[PARAM] env:
更新する環境変数を表す Hash
[PARAM] options:
オプションパラメータ Hash
[EXCEPTION] ArgumentError:
第一引数が配列かつ要素数が 2 でない場合に発生します。
[EXCEPTION] Errno::EXXX:
起動に失敗し、ruby インタプリタに制御が戻った場合に発生します。

# a.rb
exec ['sleep', 'mysleep'], '600'

上記スクリプトを実行すると以下のようになります。

$ ruby a.rb
## sleep してるので制御が戻ってこない。別の仮想端末に切替えて以下を実行
$ ps aux|grep sleep
xxxx    32754  0.0  0.0   2580   468 pts/3    S+   22:01   0:00 mysleep 600
xxxx    32761  0.0  0.0   2824   792 pts/6    S+   22:01   0:00 grep sleep

[SEE_ALSO] Kernel.#system,Kernel.#`,Kernel.#spawn,Kernel.#fork,IO.popen,IO.pipe,Kernel.#open,exec(3)

exit(status = true) -> ()

Rubyプログラムの実行を終了します。status として整 数が与えられた場合、その値を Ruby コマンドの終了ステータスとします。 デフォルトの終了ステータスは 0(正常終了)です。

status が true の場合 0、 false の場合 1 を引数に指定したとみなされます。この値はCレベルの定数 EXIT_SUCCESS、EXIT_FAILURE の値なので、正確には環境依存です。

exit は例外 SystemExit を発生させ ることによってプログラムの実行を終了させますので、 必要に応じて begin 節で捕捉することができます。

[PARAM] status:
終了ステータスを整数か true または false で与えます。
puts 'start'
begin
  puts 'start1...'
  exit
rescue SystemExit => err
  puts "end1 with #{err.inspect}"
end

begin
  puts 'start2...'
  exit
ensure
  puts 'end2...'
end
puts 'end' #実行されない

#=> start
#   start1...
#   end1 with #<SystemExit: exit>
#   start2...
#   end2...
#終了ステータス:0

[SEE_ALSO] Kernel.#exit!,Kernel.#abort, 制御構造/begin

exit!(status = false) -> ()

Rubyプログラムの実行を即座に終了します。 status として整数が与えられた場合、その値を Ruby コマンドの終了ステータスとします。 デフォルトの終了ステータスは 1 です。

status が true の場合 0、 false の場合 1 を引数に指定したとみなされます。この値はCレベルの定数 EXIT_SUCCESS、EXIT_FAILURE の値なので、正確には環境依存です。

exit! は exit とは違って、例外処理などは一切行ないませ ん。 Kernel.#fork の後、子プロセスを終了させる時などに用 いられます。

[PARAM] status:
終了ステータスを整数か true または false で与えます。
STDOUT.sync = true #表示前に終了しないようにする
puts 'start'
begin
  puts 'start1...'
  exit!
ensure
  puts 'end1...' #実行されない
end
puts 'end' #実行されない

#=> start
#   start1...
#終了ステータス:1

[SEE_ALSO] Kernel.#exit,Kernel.#abort

raise -> ()
fail -> ()
raise(message) -> ()
fail(message) -> ()
raise(error_type, message = nil, backtrace = caller(0)) -> ()
fail(error_type, message = nil, backtrace = caller(0)) -> ()

例外を発生させます。 発生した例外は変数 $! に格納されます。また例外が 発生した時のスタックトレースは変数 $@ に格納され ます。発生した例外は rescue 節で捕捉できます。

引数無しの場合は、同スレッドの同じブロック内で最後に rescue された 例外オブジェクト ($!) を再発生させます。そのような 例外が存在しないが自身は捕捉されている時には例外 RuntimeError を発生させます。

begin
  open("nonexist")
rescue
  raise   #=> `open': No such file or directory - "nonexist" (Errno::ENOENT)
end

引数を渡した場合は、例外メッセージ message を持った error_type の示す例外(省略時 RuntimeError)を 発生させます。

error_type として例外ではないクラスやオブジェクトを指定した場合、 そのオブジェクトの exception メソッドが返す値を発生する例外にします。 その際、exception メソッドに引数として変数 message を渡すことができます。

[PARAM] error_type:
発生させる例外を例外クラスまたは例外クラスのインスタンスで指定します。
[PARAM] message:
例外のメッセージとなる文字列です。
[PARAM] backtrace:
例外発生時のスタックトレースで、Kernel.#caller の戻り値と同じ 形式で指定しなければいけません。
[EXCEPTION] TypeError:
exception メソッドが例外オブジェクトを返さなかった場合に発生します。

例外の捕捉の例を示します。

#例1
begin
  raise NameError,"!!error!!"
rescue ArgumentError => err
rescue NameError => err
rescue TypeError => err
ensure
  p err #=> #<NameError: !!error!!>
end

#例2
def foo num
  print 'in method.'
  raise "error!!" if num <= 9
rescue RuntimeError
  num += 10
  print 'in rescue.'
  retry
else
  print 'in else.'
ensure
  print "in ensure.\n"
end

foo(4) #=> in method.in rescue.in method.in else.in ensure.

#例3
class MyException
  def exception(mesg=nil)
    SecurityError.new(mesg)
  end
end

begin
  raise MyException.new
rescue SecurityError
  p $! #=> #<SecurityError: SecurityError>
end

[SEE_ALSO] Kernel.#caller

fork -> Integer | nil
fork { ... } -> Integer | nil

fork(2) システムコールを使ってプロセスの複製を作 ります。親プロセスでは子プロセスのプロセスIDを、子プロセスでは nil を返します。ブロックを指定して呼び出した場合には、生成し た子プロセスでブロックを評価します。

fork 前に STDOUT と STDERR を IO#flush します。

[EXCEPTION] NotImplementedError:
実行環境がこのメソッドに対応していないとき発生します。

[SEE_ALSO] IO.popen,IO.pipe, fork(2)

sprintf(format, *arg) -> String
format(format, *arg) -> String

format 文字列を C 言語の sprintf と同じように解釈し、 引数をフォーマットした文字列を返します。

[PARAM] format:
フォーマット文字列です。
[PARAM] arg:
フォーマットされる引数です。

[SEE_ALSO] Kernel.#printf,Time#strftime,Date.strptime

sprintf フォーマット

Ruby の sprintf フォーマットは基本的に C 言語の sprintf(3) のものと同じです。ただし、short や long などの C 特有の型に対する修飾子が ないこと、2進数の指示子(%b)が存在すること、sprintf のすべての方言をサ ポートしていないこと(%': 3桁区切り)などの違いがあります。

Ruby には整数の大きさに上限がないので、%b, %o, %x に負の数を与えると (左側に無限に1が続くとみなせるので) ..f のような表示をします。絶対値に符号を付けた形式 で出力するためには %+x、% x のように指定します。

以下は sprintf フォーマットの書式です。[] で囲まれた部分は省略可 能であることを示しています。

%[引数指定$][フラグ][幅][.精度]指示子

`%' 自身を出力するには `%%' とします。

以下それぞれの要素に関して説明します。

フラグ

フラグには #, +, ' '(スペース), -, 0 の5種類があります。

#

2進、8進、16進の指示子(b, o, x, X) ではそれぞれプレフィック スとして "0b", "0", "0x", "0X" を付加します。 C 言語とは異なり引数が 0 の場合にもプレフィックスが付加されます。

  p sprintf("%#b", 10) #=> "0b1010"
  p sprintf("%#o", 10) #=> "012"
  p sprintf("%#x", 10) #=> "0xa"
  p sprintf("%#X", 10) #=> "0XA"

浮動小数点数 (f, e, E, g, G) に対しては必ず出力に"."をつけます。

  p sprintf("%.0f", 10) #=> "10"
  p sprintf("%#.0f", 10) #=> "10."
  p sprintf("%.0e", 10) #=> "1e+01"
  p sprintf("%#.0e", 10) #=> "1.e+01"

また g, G では上記に加えて末尾の余分な0が残ります。

  p sprintf("%.05g", 10) #=> "10"
  p sprintf("%#.05g", 10) #=> "10.000"
+

出力文字列を符号付きにします。特に正の数では`+'が付加されます。 数値の指示子 (d, i, b, o, x, X, u, f, e, E, g, G) に対してだけ意味を持ちます。 また、特に b, o, x, X, u に対しては、負数に対して "-" を付加することを示します。

  p sprintf("%d", 1)   #=> "1"
  p sprintf("%+d", 1)  #=> "+1"

  p sprintf("%x", -1)  #=> "..f"  # ".." は無限に f が続くことを表している
  p sprintf("%+x", -1) #=> "-1"
' '(スペース)

`+' と同じですが正の符号 `+' の代わりに空白を用います。数値の指示子 (d, i, b, o, x, X, u, f, e, E, g, G) に対してだけ意味を持ちます。

  p sprintf("%d", 1)   #=> "1"
  p sprintf("%+d", 1)  #=> "+1"
  p sprintf("% d", 1)  #=> " 1"

  p sprintf("%x", -1)  #=> "..f"
  p sprintf("% x", 1)  #=> " 1"
  p sprintf("% x", -1) #=> "-1"
-

出力を左詰めにします幅の指定がなければ 意味がありません。

0

出力が右詰めの場合に余った部分に空白の代わりに "0" を詰めます。

数値の指示子の一部(d, i, b, o, x, X, u, f, g, G)に対し てだけ意味を持ちます(e, E には意味がない)

  p sprintf("%010d", 10)   #=> "0000000010"

`#' と一緒に指定した場合の出力は以下のようになります。

  p sprintf("%#010x", 10)  #=> "0x0000000a"
  p sprintf("%#010o", 10)  #=> "0000000012"
  p sprintf("%#010b", 10)  #=> "0b00001010"

これは、以下と同じです。

  p sprintf("%#10.8x", 10) #=> "0x0000000a"
  p sprintf("%#10.9o", 10) #=> "0000000012"
  p sprintf("%#10.8b", 10) #=> "0b00001010"

通常は、以下のようになります。

  p sprintf("%#10x", 10)   #=> "       0xa"
  p sprintf("%#10o", 10)   #=> "       012"
  p sprintf("%#10b", 10)   #=> "    0b1010"

0以外の数字で始まる数字列は幅指定になります。幅は生成文字列の長さを示 します。後述の精度の値によらずこの幅分だ けの文字列が生成されます。

幅の指定はフラグで付与される " ", "+", "-", "0b", "0", "0x", "0X" の長さも考慮されます。

p sprintf("%+5d", 11)  #=> "  +11"
p sprintf("%+-5d", 11) #=> "+11  "
p sprintf("%+05d", 11) #=> "+0011"

幅は「最低限必要な幅」の指定になります。結果の文字列が指定した幅を超 える場合は幅の指定は無効になります。

幅として `*' を指定すると幅の値を引数から得ることになります。

p sprintf("%#05x", 10)    #=> "0x00a"
p sprintf("%#0*x", 5, 10) #=> "0x00a"

精度

"." の後に続く数字列は精度を表します("." のみの場合 ".0" と同じです)。精度は 整数の指示子 (d, i, b, o, x, X, u) に対しては、数値列部分の長さを意味します。

p sprintf("%10.5d", 1)  #=> "     00001"
p sprintf("%#10.5x", 1) #=> "   0x00001"
p sprintf("%+10.5x", 1) #=> "    +00001"

浮動小数点数の指示子 (f) に対しては小数部の桁数を意味します。

p sprintf("%10.5f", 1)   #=> "   1.00000"
p sprintf("%10.5f", 10)  #=> "  10.00000"

浮動小数点数の指示子 (e, E, g, G) に対しては有効桁数を意味します。

p sprintf("%10.5e", 1)   #=> "1.00000e+00"
p sprintf("%10.5e", 10)  #=> "1.00000e+01"
p sprintf("%10.5g",  10)  #=> "        10"
p sprintf("%#10.5G", 10)  #=> "    10.000"

文字列の指示子(s, p) に対しては引数の文字列のうち指定した数を超える分を切り捨てます。 幅と精度を同じ値にすれば、どのような引数に対してもその 長さだけの出力を行うことになります。

p sprintf("%10.2s", "foo")  #=> "        fo"

p sprintf("%5.5s", "foo")     #=> "  foo"
p sprintf("%5.5s", "foobar")  #=> "fooba"

精度として `*' を指定すると精度の値を引数から得ることになります。

p sprintf("%.5s", "foobar")    #=> "fooba"
p sprintf("%.*s", 5, "foobar") #=> "fooba"

指示子

指示子は引数の型の解釈を示します。指示子を省略することはできません。 指示子には大きく分けて

  • 文字列を表す指示子: c, s, p
  • 整数を表す指示子: d, i, u, b, o, x, X,
  • 浮動小数点数を表す指示子: f, g, e, E, G

があります

c

引数の数値(0〜255)を文字コードとみなして対応する文字を出力します。 引数が数値以外のオブジェクトの場合 to_int メソッドによる変換を試みます。 引数として範囲内の一文字の文字列も受けつけます。文字そのものを出力します。

  p sprintf("%c", 97)  #=> "a"
  p sprintf("%c", 'a') #=> "a"

フラグ `-' と幅 の指定だけが意味を持ちます。

s

文字列を出力します。

引数が String オブジェクトでなければ to_s メソッドにより文字列化 したものを引数として扱います。

p

Object#inspect の結果を出力します。

  p sprintf("%s", /e+/)  #=> "(?-mix:e+)"
  p sprintf("%p", /e+/)  #=> "/e+/"
d
i

引数の数値を10進表現の整数として出力します。

引数が整数でなければ関数 Kernel.#Integer と同じ規則で整数に 変換されます。

  p sprintf("%d", -1) #=> "-1"
  p sprintf("%d", 3.1) #=> "3"
  p sprintf("%d", '0b1010') #=> "10"
u

引数の数値を符号なし整数とみなして10進表現の整数として出力します。

  p sprintf("%u", '0b1010') #=> "10"
  p sprintf("%u", -1) #=> "-1"
b
o
x
X

整数をそれぞれ2進、8進、16進、16進(大文字)表現の文字列で出力します。

`#' フラグを指定すれば "0b", "0", "0x", "0X" を先頭に付加します。

`+', ` ' フラグがない場合、負の数には ".." が先頭(`#' フラグがあれば "0x" などの後)に付加されます。これは最上位桁の文字が無限に続くことを 意味し、2の補数表現で負の数を表しています。

   p sprintf("%#b", 10)    #=> "0b1010"
   p sprintf("%#o", 10)    #=> "012"
   p sprintf("%#x", 10)    #=> "0xa"

   # 負の数に対して ".." が付加されます
   p sprintf("%#b", -1)    #=> "0b..1"
   p sprintf("%#o", -1)    #=> "0..7"
   p sprintf("%#x", -1)    #=> "0x..f"

   p sprintf("%10x", -1)   #=> "       ..f"
   p sprintf("%-10x", -1)  #=> "..f       "

   # ruby 1.9.1 以降では「精度」を指定した場合も、".." は付加されます
   p sprintf("%.10x", -1) #=> "..ffffffff"
f
e
E
g
G
a
A

f は小数点表現(xxx.xxx)で数値を出力します。

e は指数表現(x.xxxe+xx)で数値を出力します。

g は 指数が -4 より小さいか精度以上の場合に e と同じ出力を、それ以 外では f と同じ出力を行います。ただし、小数部の末尾の0は取り除かれ ます。

a, A は指数表現の16進数("-h.hhh±pd") で数値を出力します。ただし、Float::INFINITYFloat::NAN はそれぞれ 'Inf'、'NaN' になります。詳しくは [ruby-dev:40650] を参照してください。

  p sprintf("%a", -0.0)            # => "-0x0p+0"
  p sprintf("%a", 729.0/10)        # => "0x1.239999999999ap+6"
  p sprintf("%a", Float::INFINITY) # => "Inf"

大文字の指示子(E, G)は出力のアルファベットを大文字にします。

  p sprintf("%f", 1.0) #=> "1.000000"
  p sprintf("%e", 1.0) #=> "1.000000e+00"
  p sprintf("%g", 1.0) #=> "1"

  p sprintf("%f", 10.1) #=> "10.100000"
  p sprintf("%e", 10.1) #=> "1.010000e+01"
  p sprintf("%g", 10.1) #=> "10.1"

  p sprintf("%g", 10 ** 6)  #=> "1e+06"
  p sprintf("%g", 10 ** -5) #=> "1e-05"

精度の省略値は 6 です。

無限大、NaN(Not a Number) に対する出力は以下のとおりです。

  p sprintf("%f",  1.0/0)  #=> "inf"
  p sprintf("%f", -1.0/0)  #=> "-inf"
  p sprintf("%f",  0.0/0)  #=> "nan"

  p sprintf("%E",  1.0/0)  #=> "INF"
  p sprintf("%E", -1.0/0)  #=> "-INF"
  p sprintf("%E",  0.0/0)  #=> "NAN"

f, e, E, g, G に関しては sprintf(3) の結果を利用しています。従って出力結果は 実際にはシステムに依存することになります。

引数指定

利用頻度が低いので最後に説明します。

nth$

nth 番目の引数のフォーマットを行うことを示します。

  p sprintf("%d, %x, %o", 1, 2, 3) #=> "1, 2, 3"
  p sprintf("%3$d, %2$x, %1$o", 1, 2, 3) #=> "3, 2, 1"

  p sprintf("%1$d, %1$x, %1$o", 10) #=> "10, a, 12"

状況によってフォーマットを変えたいが引数の順序を変えたくない場合に使 用します。

  case ENV['LC_TIME']
  when /^ja_JP/
    fmt = "%1$d年%2$d月%3$d日"
  else
    fmt = "%2$02d/%03$2d/%1$02d"
  end

  p sprintf(fmt, 1, 4, 22) #=> "04/22/01"

"*" の後に指定することで幅や 精度を引数で指定することもできます。

  p sprintf("%5.2f", 1)              #=> " 1.00"
  p sprintf("%*.*f", 5, 2, 1)        #=> " 1.00"
  p sprintf("%1$*2$.*3$f", 1, 5, 2)  #=> " 1.00"
gets(rs = $/) -> String | nil

ARGFから一行読み込んで、それを返します。 行の区切りは引数 rs で指定した文字列になります。

rs に nil を指定すると行区切りなしとみなしてファイルの内容を すべて読み込みます。ARGVに複数のファイル名が存在する場合は1度に1ファイルずつ読み込みます。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

読み込んだ文字列は組み込み変数 $_ にもセットされます。

[PARAM] rs:
行の区切りとなる文字列です。
[RETURN]
ファイルの終り(EOF)に到達した時、 nil を返します。
[EXCEPTION] Errno::EXXX:
読み込みに失敗した場合に発生します。
---main.rb---
ARGV << 'b.txt' << 'c.txt'
p gets #=> "hello\n"
p gets(nil) #=> "it\ncommon\n"
p gets("") #=> "ARGF\n\n"
p gets('、') #=> "スクリプトに指定した引数 (Kernel::ARGV を参照) をファイル名と\nみなして、"
p gets #=> "それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。 \n"
p gets #=> nil
p readline # end of file reached (EOFError)
--- b.txt ---
hello
it
common
--- c.txt ---
ARGF

スクリプトに指定した引数 (Kernel::ARGV を参照) をファイル名と
みなして、それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。

[SEE_ALSO] $/,ARGF,Kernel.#readlines,Kernel.#readline

global_variables -> [Symbol]

プログラム中で定義されているグローバル変数(`$'で始まる変数)名の 配列を返します。

p global_variables #=> [:$;, :$-F, :$@, ... ]

[SEE_ALSO] Kernel.#local_variables,Object#instance_variables,Module.constants,Module#constants,Module#class_variables

proc { ... } -> Proc
lambda { ... } -> Proc
proc -> Proc
lambda -> Proc

与えられたブロックから手続きオブジェクト (Proc のインスタンス) を生成して返します。Proc.new に近い働きをします。

ブロックが指定されなければ、呼び出し元のメソッドで指定されたブロック を手続きオブジェクトとして返します。呼び出し元のメソッドがブロックなし で呼ばれると ArgumentError 例外が発生します。

ただし、ブロックを指定しない呼び出しは推奨されていません。呼び出し元のメソッドで指定されたブロック を得たい場合は明示的に & 引数でうけるべきです。

[EXCEPTION] ArgumentError:
スタック上にブロックがないのにブロックを省略した呼び出しを行ったときに発生します。
def foo &block
  lambda(&block)
end

it = foo{p 12}
it.call #=> 12

[SEE_ALSO] Proc,Proc.new

手続きを中断して値を返す

手続きオブジェクトを中断して、呼出し元(呼び出しブロックでは yield、それ以外では Proc#call) へジャンプし値を返すには next を使います。break や return ではありません。

例:

 def foo
   f = Proc.new{
     next 1
     2
   }
 end

p foo().call       #=> 1

Proc オブジェクトをブロック付きメソッド呼び出しに使う

ブロック付きメソッドに対して Proc オブジェクトを `&' を指定して渡すと 呼び出しブロックのように動作します。 しかし、厳密には以下の違いがあります これらは、Proc オブジェクトが呼び出しブロックとして振舞う際の制限です。

# 問題なし
(1..5).each { break }

# LocalJumpError が発生します。
pr = Proc.new { break }
(1..5).each(&pr)

lambda と proc と Proc.new とイテレータの違い

Kernel.#lambdaProc.new はどちらも Proc クラスのインスタンス(手続きオブジェクト)を生成しますが、 生成された手続きオブジェクトはいくつかの場面で挙動が異なります。 lambda の生成する手続きオブジェクトのほうが よりメソッドに近い働きをするように設計されています。

Kernel.#proc は Proc.new と同じになります。 引数に & を付けることで手続きオブジェクト化したブロックは、Proc.new で生成されたそれと 同じにように振る舞います。

引数の扱い

lambda のほうがより厳密です。引数の数が違っていると(メソッドのように)エラーになります。 Proc.new は引数を多重代入に近い扱い方をします。

例:

b1 = Proc.new{|a,b,c|
  p a,b,c
}
b1.call(2, 4)
#=> 2
    4
    nil

b2 = lambda{|a,b,c|
  p a,b,c
}
b2.call(2, 4)
#=> wrong number of arguments (2 for 3) (ArgumentError)

メソッド呼び出し(super・ブロック付き・yield)/ブロックパラメータの挙動 も参照してください。

ジャンプ構文の挙動の違い

return と break は、lambda と Proc.new では挙動が異なります。 例えば return を行った場合、lambda では手続きオブジェクト自身を抜けますが、 Proc.new では手続きオブジェクトを囲むメソッドを抜けます。

例:

def foo
  f = Proc.new { return :foo }
  f.call
  return
end

def bar
  f = lambda { return :bar }
  f.call
  return
end

def h
  yield
end

def hoge
  h{ return :hoge }
  nil
end

p foo()  #=> :foo
p bar()  #=> nil
p hoge() #=> :hoge

以下の表は、手続きオブジェクトの実行を上の例と同じように、手続きオブジェクトが定義されたのと 同じメソッド内で行った場合の結果です。

               return                          next                        break
Proc.new   メソッドを抜ける            手続きオブジェクトを抜ける   例外が発生する
proc       メソッドを抜ける            手続きオブジェクトを抜ける   例外が発生する
lambda     手続きオブジェクトを抜ける  手続きオブジェクトを抜ける   手続きオブジェクトを抜ける
イテレータ メソッドを抜ける            手続きオブジェクトを抜ける   メソッドを抜ける

orphan な手続きオブジェクトの挙動

Proc を生成したメソッドから脱出した後、手続きオブジェクトからの return, break は例外 LocalJumpError を発生させます。 ただし、上でも説明した通り lambda で生成した手続きオブジェクトはメソッドと同じように振る舞う ことを意図されているため、例外 LocalJumpError は発生しません。

例:

def foo
  Proc.new { return }
end

foo.call
# => in `call': return from proc-closure (LocalJumpError)

以下の表は、手続きオブジェクトの実行を上の例と同じように、手続きオブジェクトが定義されたメソッドを 脱出してから行った場合の結果です。

               return                          next                        break
Proc.new   例外が発生する              手続きオブジェクトを抜ける   例外が発生する
proc       例外が発生する              手続きオブジェクトを抜ける   例外が発生する
lambda     手続きオブジェクトを抜ける  手続きオブジェクトを抜ける   手続きオブジェクトを抜ける
load(file, priv = false) -> true

Ruby プログラム file をロードして実行します。再ロード可能です。

file が絶対パスのときは file からロードします。 file が相対パスのときは組み込み変数 $: に示されるパスを順番に探し、最初に見付かったファイルを ロードします。このとき、$: の要素文字列の先頭文字が `~' (チルダ) だと、環境変数 HOME の値に展開されます。

ロードに成功した場合は true を返します。

[PARAM] file:
ファイル名の文字列です。
[PARAM] priv:
真のとき、ロード・実行は内部的に生成される 無名モジュールをトップレベルとして行われ、 グローバルな名前空間を汚染しません。
[EXCEPTION] LoadError:
ロードに失敗した場合に発生します。

[SEE_ALSO] Kernel.#require

require と load の違い

Kernel.#require は同じファイルは一度だけしかロードしませんが、 Kernel.#load は無条件にロードします。 また、require は拡張子.rb や .so を自動的に補完しますが、 load は行いません。 require はライブラリのロード、load は 設定ファイルの読み込みなどに使うのが典型的な用途です。

# 使用例
load "#{ENV['HOME']}/.myapprc"
load "/etc/myapprc"

なお、特定のディレクトリからファイルをロードしたい場合、 load 'filename' とするのは不適切です。必ず絶対パスを 使ってください。

local_variables -> [Symbol]

現在のスコープで定義されているローカル変数名の配列を返します。

yuyu = 0
p local_variables #=> [:yuyu]

[SEE_ALSO] Kernel.#global_variables,Object#instance_variables,Module.constants,Module#constants,Module#class_variables

loop { ... } -> object

(中断されない限り)永遠にブロックの評価を繰り返します。

与えられたブロック内で StopIterationKernel.#raise すると ループを終了して nil を返します。 ループを終了させる場合、通常は break を使用してください。

[RETURN]
break の引数など、ループ脱出時の値を返します。
def try int
  n = 0
  loop do
    n += 1
    break(n) if rand(n) > int
  end
end

puts "end on #{try(400)}" #=> end on ???
open(file, mode_enc = "r", perm = 0666) -> IO
open(file, mode_enc = "r", perm = 0666) {|io| ... } -> object

file をオープンして、IOFileを含む)クラスのインスタンスを返します。

ブロックが与えられた場合、指定されたファイルをオープンし、 生成した IO オブジェクトを引数としてブロックを実行します。 ブロックの終了時や例外によりブロックを脱出するとき、 ファイルをクローズします。ブロックを評価した結果を返します。

ファイル名 file が `|' で始まる時には続く文字列をコマンドとして起動し、 コマンドの標準入出力に対してパイプラインを生成します

ファイル名が "|-" である時、open は Ruby の子プロセス を生成し、その子プロセスとの間のパイプ(IOオブジェクト)を返し ます。(このときの動作は、IO.popen と同じです。 File.open にはパイプラインを生成する機能はありません)。

Perlと異なりコマンドは常に `|' で始まります。

[PARAM] file:
ファイルを文字列で指定します。整数を指定した場合はファイルディスクリプタとして扱います。
[PARAM] mode_enc:
モード・エンコーディングを文字列か定数の論理和で指定します。後述。
[PARAM] perm:
open(2) の第 3 引数のように、ファイルを生成する場合の ファイルのパーミッションを整数で指定します。
[EXCEPTION] Errno::EXXX:
ファイルのオープンに失敗した場合に発生します。

[SEE_ALSO] File.open,IO.popen,IO.open

第二引数のオープンモード・エンコーディング

文字列("mode" か "mode:ext_enc" か "mode:ext_enc:int_enc" という形式)か 整数(File::Constants モジュールの定数の論理和)を組み合わせて指定します。

mode は以下の三つのうちのいずれかです。

"r", RDONLY

ファイルを読み込みモードでオープンします。(デフォルトのモード)

"w", WRONLY|CREAT|TRUNC

ファイルを書き込みモードでオープンします。 オープン時にファイルがすでに存在していれば その内容を空にします。

"a", WRONLY|CREAT|APPEND

ファイルを書き込みモードでオープンします。 出力は 常に ファイルの末尾に追加されます。 例えば、ファイルオープン中にファイルのサイズが小さ くなってもその末尾に出力されます。

以上の3つの後に "+" があれば、ファイルは読み書き両用モード (RDWR) でオープンされます。

"r+"

ファイルの読み書き位置は先頭にセットされます。

"w+"

"r+" と同じですが、オープン時にファイルがすでに 存在していればその内容を空にします。

"a+"

"r+"と同様、ファイルの読み込み位置は先頭にセットされますが、 書き込みは常にファイル末尾に行われます。書き込みは IO#seek などの影響を受けません。

これらのいずれに対しても "b" フラグを ("r+b"のように) つけることがで きます (整数なら File::BINARY )。この場合、バイナリモードでオープン します (ただし、DOS/Windowsのようにシステムがテキスト/バイナリでファイルを区別する場 合に限ります)

Universal Newline

改行をLFに揃えます。一言で言えばPEP:278 http://www.python.org/dev/peps/pep-0278/のことです。

"rt"

CR、LF、CRLFのいずれをもLFとして読み込む。

"rb"

CR、LF、CRLFはいずれもそのまま読み込まれる。

"r"

"rt"と"rb"のどちらの扱いになるかはプラットフォーム依存。 (Unix系ならばなら"rb"、mswinやmingwなら"rt"扱いとなる)

"wb"

LFはそのままLFとして書き込まれる。

"wt" または "w"

LFはLFのままか、CR+LFか、どちらかになる。どちらになるかはプラットフォーム依存。 (Unix系ならばLFのまま、mswinやmingwならばCRLFとなる)

なお、以上のCR、LF、CRLFは入力のエンコーディングを解釈した後に処理されます。例えば、UTF-16LEでは、LFはバイト列"\x0a\x00"のことになります。

エンコーディングの指定

ext_enc(外部エンコーディング)が指定されている場合、 読み込まれた文字列にはこのエンコーディングが指定され、 出力する文字列はそのエンコーディングに変換されます。

ext_encが'-bom'で終わる場合、その入力に含まれるBOMはあらかじめ削られます。 また、BOMがあった場合、入力された文字列にはそのBOMに対応するエンコーディングが設定されます。

int_encも指定されていた場合、入力された文字列をext_encでエンコーディングされた文字列とみなしてint_encへと変換し、その結果にint_encを設定して返します。

open(name, mode = 'r', perm = nil, options = {}) -> StringIO | File [redefined by open-uri]
open(name, mode = 'r', perm = nil, options = {}) {|ouri| ...} -> nil [redefined by open-uri]

name が http:// や ftp:// で始まっている文字列なら URI のリソースを 取得した上で StringIO オブジェクトとして返します。 StringIO オブジェクトは OpenURI::Meta モジュールで extend されています。

name に open メソッドが定義されている場合は、*rest を引数として渡し name.open(*rest, &block) のように name の open メソッドが呼ばれます。

これ以外の場合は、name はファイル名として扱われ、従来の Kernel.#open(name, *rest) が呼ばれます。

ブロックを与えた場合は上の場合と同様、name が http:// や ftp:// で 始まっている文字列なら URI のリソースを取得した上で StringIO オブジェクトを 引数としてブロックを評価します。後は同様です。 StringIO オブジェクトは OpenURI::Meta モジュールで extend されています。

[PARAM] name:
オープンしたいリソースを文字列で与えます。
[PARAM] mode:
モードを文字列で与えます。Kernel.#open と同じです。
[PARAM] perm:
open(2) の第 3 引数のように、ファイルを生成する場合のファイルのパーミッションを 整数で指定します。Kernel.#open と同じです
[PARAM] options:
ハッシュを与えます。詳しくは OpenURI.open_uri を参照してください。
[EXCEPTION] OpenURI::HTTPError:
対象となる URI のスキームが http であり、 かつリソースの取得に失敗した時に発生します。
[EXCEPTION] Net::FTPError:
対象となる URI のスキームが ftp であり、かつリソースの取得に失敗した時に Net::FTPError のサブクラスが発生します。詳しくは net/ftp を参照して下さい。

例:

require 'open-uri'
sio = open('http://www.example.com')
p sio.is_a?(OpenURI::Meta) # => true
p sio.content_type
puts sio.read

[SEE_ALSO] OpenURI.open_uri

p(*arg) -> object | Array

引数を人間に読みやすい形に整形して改行と順番に標準出力 $stdout に出力します。主にデバッグに使用します。

引数の inspect メソッドの返り値と改行を順番に出力します。つまり以下のコードと同じです。

print arg[0].inspect, "\n", arg[1].inspect, "\n", ...

整形に用いられるObject#inspectは普通に文字列に変換すると 区別がつかなくなるようなクラス間の差異も表現できるように工夫されています。

p に引数を与えずに呼び出した場合は特に何もしません。

[PARAM] arg:
出力するオブジェクトを任意個指定します。
[EXCEPTION] IOError:
標準出力が書き込み用にオープンされていなければ発生します。
[EXCEPTION] Errno::EXXX:
出力に失敗した場合に発生します。
[RETURN]
指定された引数 arg を返します。複数の引数が指定された場合はそれらを要素とする配列を返します。
puts "" #=> (空行)
p "" #=> ""

puts 50,"50"
#=> 50
#=> 50
p 50,"50"
#=> 50
#=> "50"

[SEE_ALSO] Object#inspect,Kernel.#puts,Kernel.#print

print(*arg) -> nil

引数を順に標準出力 $stdout に出力します。引数が与えられない時には変数 $_ の値を出力します。

文字列以外のオブジェクトが引数として与えられた場合には、 to_s メソッドにより文字列に変換してから出力します。

変数 $, (出力フィールドセパレータ)に nil で ない値がセットされている時には、各引数の間にその文字列を出力します。 変数 $\ (出力レコードセパレータ)に nil でな い値がセットされている時には、最後にそれを出力します。

[PARAM] arg:
出力するオブジェクトを任意個指定します。
[EXCEPTION] IOError:
標準出力が書き込み用にオープンされていなければ発生します。
[EXCEPTION] Errno::EXXX:
出力に失敗した場合に発生します。
print "Hello, world!"
print "Regexp is",/ant/
print nil
print "\n"
#=> Hello, world!Regexp is(?-mix:ant)

$_ = "input"
$, = "<and>"
$\ = "<end>\n"
print
print "AA","BB"
#=> input<and><end>
#=> AA<and>BB<and><end>

[SEE_ALSO] Kernel.#puts,Kernel.#p

printf(format, *arg) -> nil
printf(port, format, *arg) -> nil

C 言語の printf と同じように、format に従い引数を文字列に変 換して port に出力します。

port を省略した場合は標準出力 $stdout に出力します。

引数を 1 つも指定しなければ何もしません。

Ruby における format 文字列の拡張については Kernel.#sprintfの項を参照してください。

[PARAM] port:
出力先になるIO のサブクラスのインスタンスです。
[PARAM] format:
フォーマット文字列です。
[PARAM] arg:
フォーマットされる引数です。
[EXCEPTION] ArgumentError:
port を指定したのに format を省略した場合に発生します。
[EXCEPTION] IOError:
port が書き込み用にオープンされていなければ発生します。
[EXCEPTION] Errno::EXXX:
出力に失敗した場合に発生します。
printf("calculate%3s%-6s%.15f", 'PI', '...', Math::PI)
#=> calculate PI...   3.141592653589793

printf("%d %04x", 123, 123)               #=> "123 007b"
printf("%08b '%4s'", 123, 123)            #=> "01111011 ' 123'"
printf("%1$*2$s %2$d %1$s", "hello", 8)   #=> "   hello 8 hello"
printf("%1$*2$s %2$d", "hello", -8)       #=> "hello    -8"
printf("%+g:% g:%-g", 1.23, 1.23, 1.23)   #=> "+1.23: 1.23:1.23"
printf("%u", -123)                        #=> "..4294967173"

[SEE_ALSO] Kernel.#sprintf,IO#printf

putc(ch) -> object

文字 ch を 標準出力 $stdout に出力します。

ch が数値なら 0 〜 255 の範囲の対応する文字を出力します。 ch が文字列なら、その先頭 1byte を出力します。 どちらでもない場合は、ch.to_int で整数に変換を試みます。

[PARAM] ch:
出力する文字です。数または文字列で指定します。
[RETURN]
ch を返します
[EXCEPTION] RangeError:
Bignum を引数にした場合に発生します。
[EXCEPTION] IOError:
標準出力が書き込み用にオープンされていなければ発生します。
[EXCEPTION] Errno::EXXX:
出力に失敗した場合に発生します。
[EXCEPTION] TypeError:
Integer に変換できないオブジェクトを引数に 指定した場合に発生します。
putc("ch")
putc(?c)
putc(99)
putc(355)
#=> cccc

putc(99.00) #=> c
putc(33333333333333333333333333333333333) # bignum too big to convert into `long' (RangeError)

[SEE_ALSO] IO#putc

puts(*arg) -> nil

引数と改行を順番に 標準出力 $stdout に出力します。 引数がなければ改行のみを出力します。

引数が配列の場合、その要素と改行を順に出力します。 配列や文字列以外のオブジェクトが引数として与えられた場合には、 当該オブジェクトを最初に to_ary により配列へ、 次に to_s メソッドにより文字列へ変換を試みます。 末尾が改行で終っている引数や配列の要素に対しては puts 自身 は改行を出力しません。

[PARAM] arg:
出力するオブジェクトを任意個指定します。
[EXCEPTION] IOError:
標準出力が書き込み用にオープンされていなければ発生します。
[EXCEPTION] Errno::EXXX:
出力に失敗した場合に発生します。
puts "foo", "bar\n", "baz"
puts ""    # 改行のみ出力
puts       # 改行のみ出力
puts nil   # 改行のみ出力
puts ["oui", "non"]
#=> foo
#   bar
#   baz
#
#
#
#   oui
#   non

[SEE_ALSO] Kernel.#print, Kernel.#p, IO#puts

rand(max = 0) -> Integer|Float

擬似乱数を得るメソッドです。

max.to_i.abs(引数の整数表現の絶対値)が 0以外 の場合、 0 以上 max.to_i.abs 未満の範囲の整数をランダムに返します。 また 0 の場合、0.0 以上 1.0 未満の範囲の浮動小数点数をランダムに返します。

まだ Kernel.#srand が呼ばれていなければ自動的に呼び出します。

[PARAM] max:
数値オブジェクトです。
p rand(63) #=> 20
p rand(63) #=> 56
p rand(0) #=> 0.341033520223401
p rand(0) #=> 0.31341550089985

p rand(-5) #=> 2
p rand(0.9) #=> 0.195303845149051
p rand(1.5) #=> 0

[SEE_ALSO] Kernel.#srand, Object#to_int, Numeric#abs

readline(rs = $/) -> String

ARGFから一行読み込んで、それを返します。 行の区切りは引数 rs で指定した文字列になります。

rs に nil を指定すると行区切りなしとみなしてファイルの内容を すべて読み込みます。ARGVに複数のファイル名が存在する場合は1度に1ファイルずつ読み込みます。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

読み込んだ文字列は組み込み変数 $_ にもセットされます。

[PARAM] rs:
行の区切りとなる文字列です。
[EXCEPTION] Errno::EXXX:
読み込みに失敗した場合に発生します。
[EXCEPTION] EOFError:
readline でファイル末端(EOF)を検出すると発生します。
---main.rb---
ARGV << 'b.txt' << 'c.txt'
p readline #=> "hello\n"
p readline(nil) #=> "it\ncommon\n"
p readline("") #=> "ARGF\n\n"
p readline('、') #=> "スクリプトに指定した引数 (Kernel::ARGV を参照) をファイル名と\nみなして、"
p readline #=> "それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。 \n"
p readline # end of file reached (EOFError)
--- b.txt ---
hello
it
common
--- c.txt ---
ARGF

スクリプトに指定した引数 (Kernel::ARGV を参照) をファイル名と
みなして、それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。

[SEE_ALSO] $/,ARGF,Kernel.#readlines,Kernel.#gets

readlines(rs = $/) -> [String] | nil

ARGFKernel.#gets(rs) でEOFまで読み込んで、その各行を要素としてもつ配列を返します。 行の区切りは引数 rs で指定した文字列になります。

rs に nil を指定すると行区切りなしとみなします。 空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

[PARAM] rs:
行の区切りとなる文字列です。
[EXCEPTION] Errno::EXXX:
読み込みに失敗した場合に発生します。
---main.rb---
ARGV << 'b.txt' << 'b.txt'
p readlines #=> ["hello\n", "it\n", "\n", "common\n", "hello\n", "it\n", "\n", "common\n"]

ARGV << 'b.txt' << 'b.txt'
p readlines(nil) #=> ["hello\nit\n\ncommon\n", "hello\nit\n\ncommon\n"]

ARGV << 'b.txt' << 'b.txt'
p readlines("") #=> ["hello\nit\n\n", "common\n", "hello\nit\n\n", "common\n"]

ARGV << 'b.txt' << 'b.txt'
p readlines('it') #=> ["hello\nit", "\n\ncommon\n", "hello\nit", "\n\ncommon\n"]
p readlines #=> nil
--- b.txt ---
hello
it

common

[SEE_ALSO] $/,ARGF,Kernel.#gets

require(feature) -> bool

Ruby ライブラリ feature をロードします。拡張子補完を行い、 同じファイルの複数回ロードはしません。

feature が絶対パスのときは feature からロードします。 feature が相対パスのときは組み込み変数 $: に示されるパスを順番に探し、最初に見付かったファイルを ロードします。このとき、$: の要素文字列の先頭文字が `~' (チルダ) だと、環境変数 HOME の値に展開されます。

Ruby ライブラリとは Ruby スクリプト (*.rb) か拡張ライブラリ (*.so,*.o,*.dll など) であり、feature の拡張子が省略された場合はその 両方から探します( *.rb が優先されます)。 省略されなかった場合は指定された種別のみを探します。 また、feature の拡張子にはアーキテクチャで実際に使われる拡張子に 関らず拡張ライブラリの拡張子として常に .so を用いることができます(内部で適切に変換されます)。

ライブラリのロードに成功した時には true を返し、ロードした feature の名前を(拡 張子も含めて) 変数 $" に追加します。ただし、feature の名前が既に $" に含まれていた場合はロードせずに false を返します。

[PARAM] feature:
ファイル名の文字列です。
[EXCEPTION] LoadError:
ロードに失敗した場合に発生します。

[SEE_ALSO] Kernel.#load,Kernel.#autoload,Kernel.#require_relative

require_relative(relative_feature) -> bool

現在のファイルからの相対パスで require します。

require File.expand_path(relative_feature, File.dirname(__FILE__))

とほぼ同じです。

Kernel.#eval などで文字列を評価した場合に、そこから require_relative を呼出すと必ず失敗します。

[PARAM] relative_feature:
ファイル名の文字列です。
[EXCEPTION] LoadError:
ロードに失敗した場合に発生します。

[SEE_ALSO] Kernel.#require

require と load のスコープ

ローカル変数はファイル間では共有されません。ですので、 ロードしたライブラリのローカル変数を ロード元のスクリプトから直接取得することはできません。 このスコープの扱い方はKernel.#loadでも同様です。

---------- some.rb -----------
$a = 1
@a = 1
A = 1
a = 1
---------- end some.rb -------

require 'some'
p $a #=> 1
p @a #=> 1
p A #=> 1
p a # undefined local variable or method `a' for #<Object:0x294f9ec @a=1> (NameError)
select(reads, writes = [], excepts = [], timeout = nil) -> [[IO]] | nil

IO.select と同じです。

[PARAM] reads:
IO.select 参照
[PARAM] writes:
IO.select 参照
[PARAM] excepts:
IO.select 参照
[PARAM] timeout:
IO.select 参照

[SEE_ALSO] IO.select

set_trace_func(proc) -> Proc

Ruby インタプリタのイベントをトレースする Proc オブジェクトとして 指定された proc を登録します。 nil を指定するとトレースがオフになります。

Ruby インタプリタがプログラムを実行する過程で、メソッドの呼び出しや 式の評価などのイベントが発生する度に、以下で説明する6個の引数とともに 登録された Proc オブジェクトを実行します。

標準添付の debugtracerprofile はこの組み込み関数を利用して実現されています。

ブロックパラメータの意味

渡す Proc オブジェクトのパラメータは

proc{|event, file, line, id, binding, klass| ... }

で、意味は以下の通りです。

event

実行のタイプを表す、以下のいずれかの文字列。

  "line":      式の評価。
  "call":      メソッドの呼び出し。
  "return":    メソッド呼び出しからのリターン。
  "c-call":    Cで記述されたメソッドの呼び出し。
  "c-return":  Cで記述されたメソッド呼び出しからのリターン。
  "class":     クラス定義、特異クラス定義、モジュール定義への突入。
  "end":       クラス定義、特異クラス定義、モジュール定義の終了。
  "raise":     例外の発生。
file

実行中のプログラムのソースファイル名 (文字列)。

line

実行中のプログラムのソースファイル上の行番号 (整数)。

id

event に応じ、以下のものが渡されます。 第六ブロック引数の klass と対応しています。

    line
        最後に呼び出されたメソッドを表す Symbol オブジェクト。
        トップレベルでは nil。
    call/return/c-call/c-return
        呼び出された/リターンするメソッドを表す Symbol オブジェクト。
    class/end
        nil。
    raise
        最後に呼び出されたメソッドを表す Symbol オブジェクト。
        トップレベルでは nil。
binding

実行中のプログラムのコンテキストを表す Binding オブジェクト。

klass

event に応じ、以下のものが渡されます。 第四ブロック引数の id と対応しています。

    line
        最後に呼び出されたメソッドが属するクラスを表す
        Class オブジェクト。トップレベルでは false。
    call/return/c-call/c-return
        呼び出された/リターンするメソッドが属するクラス
        を表す Class オブジェクト。
    class/end
        false。
    raise
        最後に呼び出されたメソッドが属するクラスを表す
        Class オブジェクト。トップレベルでは false。
[PARAM] proc:
トレース用 Proc オブジェクトを指定します。nil を指定した場合、トレースをオフにします。
[RETURN]
proc を返します。

例:

set_trace_func lambda {|*arg|
  p arg
}
class Foo
end
43.to_s

#----結果----
#["line", "..", 4, nil, #<Binding:0x2b69584>, false]
#  ["c-call", "..", 4, :inherited, #<Binding:0x2b693b8>, Class]
#    ["c-return", "..", 4, :inherited, #<Binding:0x2b6937c>, Class]
#      ["class", "..", 4, nil, #<Binding:0x2b69098>, false]
#        ["end", "..", 4, nil, nil, false]
#        ["line", "..", 6, nil, #<Binding:0x2b68d78>, false]
#          ["c-call", "..", 6, :to_s, #<Binding:0x2b68c88>, Fixnum]
#            ["c-return", "..", 6, :to_s, #<Binding:0x2b68aa8>, Fixnum]

[SEE_ALSO] Kernel.#caller

sleep -> Integer
sleep(sec) -> Integer

sec 秒だけプログラムの実行を停止します。

sec が省略された場合、他スレッドからの Thread#run などで明示的に起こさない限り永久にスリープします。Thread#runを呼ぶとその時点で sleepの実行が中断されます。

[PARAM] sec:
停止する秒数を非負の数値で指定します。浮動小数点数も指定できます。 省略された場合、永久にスリープします。
[RETURN]
実際に停止していた秒数 (整数に丸められた値) です。
it = Thread.new do
  sleep
  puts 'it_end'
end

re = sleep 2.11
puts re
it.run
re2 = sleep 0.76
puts re2
#=> 2
#   it_end
#   1
spawn(command, options={}) -> Integer
spawn(env, command, options={}) -> Integer

引数を外部コマンドとして実行しますが、生成した 子プロセスの終了を待ち合わせません。生成した子プロセスのプロセスIDを返します。

引数の解釈

この形式では command が shell のメタ文字

  * ? {} [] <> () ~ & | \ $ ; ' ` " \n

を含む場合、shell 経由で実行されます。 そうでなければインタプリタから直接実行されます。

[PARAM] command:
コマンドを文字列で指定します。
[PARAM] env:
更新する環境変数を表す Hash
[PARAM] options:
オプションパラメータ Hash
[EXCEPTION] Errno::EXXX:
起動に失敗し、ruby インタプリタに制御が戻った場合に発生します。
[EXCEPTION] Errno::EXXX:
コマンドが実行できなかった場合に発生します。

[SEE_ALSO] Kernel.#system,Kernel.#exec

spawn(program, *args) -> Integer
spawn(env, program, *args, options={}) -> Integer

引数を外部コマンドとして実行しますが、生成した 子プロセスの終了を待ち合わせません。生成した子プロセスのプロセスIDを返します。

env に Hash を渡すことで、exec(2) で子プロセス内で ファイルを実行する前に環境変数を変更することができます。 Hash のキーは環境変数名文字列、Hash の値に設定する値とします。 nil とすることで環境変数が削除(unsetenv(3))されます。

# FOO を BAR にして BAZ を削除する
pid = spawn({"FOO"=>"BAR", "BAZ"=>nil}, command)

親プロセスは Process.#waitpid で子プロセスの終了を待ち合わせるか もしくは Process.#detach で子プロセスを切り離すかしてください。 そうでないとゾンビプロセスが残る場合があります。

引数の解釈

この形式で呼び出した場合、空白や shell のメタキャラクタも そのまま program の引数に渡されます。 先頭の引数が2要素の配列であった場合、第1要素の文字列が実際に 起動するプログラムのパスであり、第2要素が「みせかけ」のプロ グラム名になります。 また、第1要素はフルパスで指定しなくても環境変数 PATH から探します。

option引数の概要

Hash を options として渡すことで、起動される子プロセスの

  • プロセスグループ
  • resource limit
  • カレントディレクトリ
  • umask
  • 子プロセスでのリダイレクト

などを変更できます。環境変数のクリアなども指定できます。

以下のオプションが指定できます。

:unsetenv_others

これを true にすると、envで指定した環境変数以外をすべてクリアします。 false だとクリアしません。false がデフォルトです。

:pgroup

引数に true or 0 を渡すと新しいプロセスグループを作成し、そこで動きます。 整数を渡すと、指定したプロセスグループに属します nil を渡すとプロセスグループを変更しません。デフォルトは nil です。

:rlimit_core, :rlimit_cpu, etc

resource limit を設定します。詳しくは Process.#setrlimit を見て ください。引数には整数、もしくは整数2つの配列を渡します。

:chdir

指定した文字列をカレントディレクトリにします。

:umask

指定した整数を umask に設定します。

リダイレクト関連

Hash のキーに子プロセス側のファイルデスクリプタを、 対応する値に親プロセス側のファイルデスクリプタや ファイル名を指定することでリダイレクトを実現できます。

:close_others

これを true に設定すると リダイレクトされていない、0(stdin), 1(stdout), 2(stderr) 以外の ファイルデスクリプタをすべて閉じます。 true がデフォルトです。

option引数によるリダイレクトの概要

Hash のキー(子プロセス側)には以下のいずれかが指定できます。

  • 単一のファイルデスクリプタ
  • ファイルデスクリプタの配列

配列を渡すことで複数のファイルデスクリプタを同時にリダイレクトできます。

Hash の値(親プロセス側)には以下のいずれかが指定できます。

  • 単一のファイルデスクリプタ
  • リダイレクト先のファイル名文字列
  • [リダイレクト先のファイル名文字列]、配列の要素にすることで File::RDONLY でファイルを開いてリダイレクトします。
  • [リダイレクト先のファイル名文字列, モード文字列] open(ファイル名, モード, 0644) でファイルを開いてリダイレクト します。
  • [リダイレクト先のファイル名文字列, モード文字列, パーミション(整数)] open(ファイル名, モード, パーミッション) でファイルを 開いてリダイレクトします。
  • [:child, ファイルデスクリプタ] 子プロセス側のファイルデスクリプタを指定できます。
  • :close キーで指定したファイルデスクリプタを子プロセス側で閉じます

ファイルデスクリプタを表すためには、以下が利用できます。

  • :in 標準入力, ファイルデスクリプタ0
  • :out 標準出力, ファイルデスクリプタ1
  • :err 標準エラー出力, ファイルデスクリプタ2
  • 整数 指定した整数が表すファイルデスクリプタ
  • IO IO#fileno で表されるファイルデスクリプタ

option引数の詳細および例

「:unsetenv_others」を使うと、envで指定したもの以外の環境変数を クリアします。

# すべての環境変数をクリア
pid = spawn(command, :unsetenv_others=>true)
# FOO だけ
pid = spawn({"FOO"=>"BAR"}, command, :unsetenv_others=>true)

「:pgroup」でプロセスグループを指定できます。

# true, 0 で新しいプロセスグループを作りそのリーダーになります。
pid = spawn(command, :pgroup => true)
# 整数を渡すとそのグループに所属します。
pid = spawn(command, :pgroup => 10)

「:rlimit_core」「:rlimit_cpu」などで、resource limit を指定します。 詳しくは Process.#setrlimit を見てください。 このオプションには 整数 or 整数2つの配列、を渡すことができます。 それぞれ Process.#setrlimit の引数が2個、3個の場合に対応します。

# 現プロセスの core の resource limit を取得
cur, max = Process.getrlimit(:CORE)
# 一時的に子プロセスの core dump を止める
pid = spawn(command, :rlimit_core=>[0,max]) # disable core temporary.
# 子プロセスで core dump を出せるようにする
pid = spawn(command, :rlimit_core=>max) # enable core dump
# 子プロセスで core dump を出せなくする
pid = spawn(command, :rlimit_core=>0) # never dump core.

「:chdir」で子プロセスのカレントディレクトリを変更できます。

pid = spawn(command, :chdir=>"/var/tmp")

「:umask」で子プロセスの umask を指定できます。

pid = spawn(command, :umask=>077)

リダイレクトは様々なやりかたが使えます。 Hash のキーが子プロセス側、値が親プロセス側です。

# 以下の例はすべて stderr を stdout にリダイレクトします
pid = spawn(command, :err=>:out)
pid = spawn(command, 2=>1)
pid = spawn(command, STDERR=>:out)
pid = spawn(command, STDERR=>STDOUT)

この例では子プロセス側の stdout には触れていないので、 親プロセスから引き継がれます。

Hash の値にはファイル名も指定できます。

pid = spawn(command, :in=>"/dev/null") # read mode
pid = spawn(command, :out=>"/dev/null") # write mode
pid = spawn(command, :err=>"log") # write mode
pid = spawn(command, 3=>"/dev/null") # read mode

stdout と stderr をリダイレクトした場合は、 ファイルは write mode で open されます。それ以外の場合は read mode で open されます。

ファイルのフラグ(write/read mode)やパーミッションを明示したい 場合は、配列を用います。

# なにも指定がなければデフォルトで read mode が使われる。
pid = spawn(command, :in=>["file"])
# read mode で file を open し、リダイレクトする。
pid = spawn(command, :in=>["file", "r"])
# write mode で file を open し、リダイレクトする。
# パーミッションはデフォルトで 644。
pid = spawn(command, :out=>["log", "w"]) # 0644 assumed
# write mode、パーミッション 0600 でファイルをオープンし、リダイレクトする。
pid = spawn(command, :out=>["log", "w", 0600])
# flagを文字列でなくビットで指定する
pid = spawn(command, :out=>["log", File::WRONLY|File::EXCL|File::CREAT, 0600])

配列で複数のファイルデスクリプタを同時にリダイレクトできます。

# stdout と stderr を "log" ファイルにリダイレクト
pid = spawn(command, [:out, :err]=>["log", "w"])

複数のファイルデスクリプタを合わせてリダイレクトするには、 [ :child, FileDescriptor ] を使うこともできます。 これは子プロセス側で FileDescriptor にリダイレクトすることを意味します。 これはファイルデスクリプタを直接指定するのと異なるということに 注意してください。 例えば、

:err => :out

とすると、子プロセスの stderr を親プロセスの stdout にリダイレクトします。

:err => [:child, :out]

とすると、子プロセスの stderr を子プロセスの stdout にリダイレクトします。 これを用いて、IO.popen で、子プロセスの stderr と stdout を混ぜる例を以下に示します。

io = IO.popen(["sh", "-c", "echo out; echo err >&2", :err=>[:child, :out]])
p io.read #=> "out\nerr\n

spawn と IO.popen では デフォルトでは非標準的なファイルデスクリプタ(3以降)をすべて閉じます。 「:close_others」オプションでこの挙動を制御できます。 標準的ファイルデスクリプタ(0,1,2)は :close で明示的に閉じない 限り、このオプションの影響を受けません。

pid = spawn(command, :close_others=>true)  # close 3,4,5,... (default)
pid = spawn(command, :close_others=>false) # don't close 3,4,5,...

これを利用して spawn を IO.popen のように使うことができます。

# similar to r = IO.popen(command)
r, w = IO.pipe
pid = spawn(command, :out=>w)   # r は子プロセスで閉じられる
w.close

「:close」を使ってファイルデスクリプタを明示的に閉じることもできます。

f = open(foo)
# f は継承されない
# system は :close_others=>false がデフォルトなのでそれ以外は継承される
system(command, f=>:close)        # don't inherit f.

spawn で特定のファイルデスクリプタだけを継承したい場合は、 io => io という形のオプションを指定します。

# valgrind は --log-fd というオプションでログの出力先を指定できます。
# これで指定したファイルデスクリプタは親プロセスから
# 子プロセスに継承されなければならないため、 log_w=>log_w とします。
log_r, log_w = IO.pipe
pid = spawn("valgrind", "--log-fd=#{log_w.fileno}", "echo", "a", log_w=>log_w)
log_w.close
p log_r.read

ファイルデスクリプタを入れ替えることもできます。

# stdout と stderr を入れ替えリダイレクト
pid = spawn(command, :out=>:err, :err=>:out)

このような相互参照を解決するため、spawnの内部で新しい ファイルデスクリプタを作り、利用します。

[PARAM] env:
更新する環境変数を表す Hash
[PARAM] program:
文字列か2要素の配列を指定します。
[PARAM] args:
渡される引数です。0 個以上の文字列を指定します。
[PARAM] options:
オプションパラメータ Hash
[EXCEPTION] ArgumentError:
第一引数が配列かつ要素数が 2 でない場合に発生します。
[EXCEPTION] Errno::EXXX:
コマンドが実行できなかった場合に発生します。

[SEE_ALSO] Kernel.#system,Kernel.#exec

srand -> Integer
srand(seed) -> Integer

Kernel.#rand の乱数の種を設定し、古い種を返します。

seed.to_i(引数の整数表現)を乱数の種に設定します。 seed に既知の値を与えると、以前の Kernel.#rand の値を再現できます。

初期値 seed が省略された時には 現在の時刻やプロセス ID、srand を呼び出した回数、 また可能なら /dev/urandom から読み出したデータなどを元に種を作ります。

[PARAM] seed:
乱数の種となる数値を指定します。to_int メソッドにより整数に変換されます。 Bignum も指定可能です。
num = 455675
seeds = []

srand(num)

p rand(6) #=> 3
p rand(6) #=> 0
p rand(0) #=> 0.445804380918972
p rand(0) #=> 0.422248634121701

seeds << srand

p rand(6) #=> 3
p rand(6) #=> 3
p rand(0) #=> 0.938911141393347
p rand(0) #=> 0.915824970865251

seeds << srand(num)

p rand(6) #=> 3
p rand(6) #=> 0
p rand(0) #=> 0.445804380918972
p rand(0) #=> 0.422248634121701

seeds << srand

p seeds #=> [455675, 2995620310703489221660585195204777696, 455675]

[SEE_ALSO] Kernel.#rand, Object#to_int

syscall(num, *arg) -> Integer

numで指定された番号のシステムコールを実行します。 第2引数以降をシステムコールの引数として渡します。

どの数値がどのシステムコールに対応するかは、 syscall(2) や /usr/include/sys/syscall.h を参照してください。

システムコールの慣習に従い、syscall(2) が -1 を返す場合には例外 Errno::EXXX が発生します。 それ以外では、返した値をそのまま数値で返します。

ライブラリ dl を使えばより高レベルな操作ができます。

[PARAM] num:
システムコール番号です。
[PARAM] arg:
文字列か、整数です。最大 9 個まで渡すことができます。
[EXCEPTION] Errno::EXXX:
syscall(2) が -1 を返した場合に発生します。
[EXCEPTION] NotImplementedError:
実行環境がこのメソッドに対応していないとき発生します。

[SEE_ALSO] dl, syscall(2freebsd), syscall(2linux)

system(command, options={}) -> bool | nil
system(env, command, options={}) -> bool | nil

引数を外部コマンドとして実行して、成功した時に真を返します。

子プロセスが終了ステータス 0 で終了すると成功とみなし true を返します。 それ以外の終了ステータスの場合は false を返します。 コマンドを実行できなかった場合は nil を返します。

終了ステータスは変数 $? で参照できます。

コマンドを実行することができなかった場合、多くのシェルはステータス 127 を返します。(したがって $? の数値は、0x7f00)、シェルを介 さない場合は Ruby の子プロセスがステータス 127 で終了します。 コマンドが実行できなかったのか、コマンドが失敗したのかは、普通 $? を参照することで判別可能です。

引数の解釈

この形式では command が shell のメタ文字

  * ? {} [] <> () ~ & | \ $ ; ' ` " \n

を含む場合、shell 経由で実行されます。 そうでなければインタプリタから直接実行されます。

[PARAM] command:
command コマンドを文字列で指定します。
[PARAM] env:
更新する環境変数を表す Hash
[PARAM] options:
オプションパラメータ Hash

[SEE_ALSO] Kernel.#`,Kernel.#spawn,Kernel.#exec,system(3)

system(program, *args, options={}) -> bool | nil
system(env, program, *args, options={}) -> bool | nil

引数を外部コマンドとして実行して、成功した時に真を返します。

子プロセスが終了ステータス 0 で終了すると成功とみなし true を返します。 それ以外の終了ステータスの場合 (コマンドを実行できなかった場合も含む)は false を返します。

終了ステータスは変数 $? で参照できます。

コマンドを実行することができなかった場合、多くのシェルはステータス 127 を返します。(したがって $? の数値は、0x7f00)、シェルを介 さない場合は Ruby の子プロセスがステータス 127 で終了します。 コマンドが実行できなかったのか、コマンドが失敗したのかは、普通 $? を参照することで判別可能です。

Hash を options として渡すことで、起動される子プロセスの

  • プロセスグループ
  • resource limit
  • カレントディレクトリ
  • umask
  • 子プロセスでのリダイレクト

などを変更できます。環境変数のクリアなども指定できます。 詳しくは Kernel.#spawn を参照してください。

引数の解釈

この形式で呼び出した場合、空白や shell のメタキャラクタも そのまま program の引数に渡されます。 先頭の引数が2要素の配列であった場合、第1要素の文字列が実際に 起動するプログラムのパスであり、第2要素が「みせかけ」のプロ グラム名になります。 また、第1要素はフルパスで指定しなくても環境変数 PATH から探します。

[PARAM] program:
文字列か2要素の配列です。
[PARAM] args:
program に渡す引数を 0 個以上指定する
[PARAM] env:
更新する環境変数を表す Hash
[PARAM] options:
オプションパラメータ Hash
[EXCEPTION] ArgumentError:
第一引数が配列かつ要素数が 2 でない場合に発生します。

[SEE_ALSO] Kernel.#`,Kernel.#spawn,Kernel.#exec,system(3)

test(cmd, file) -> bool | Time | Integer | nil

単体のファイルでファイルテストを行います。

[PARAM] cmd:
以下に示す数値リテラルか文字列です(文字列の場合はその先頭の文字だけをコマンドとみなします)。
[PARAM] file:
テストするファイルオブジェクトです。
[RETURN]
下表に特に明記していないものは、真偽値を返します。

以下は cmd として指定できる数値リテラルとその意味です。

?r

ファイルを実効 uid で読むことができる

?w

ファイルに実効 uid で書くことができる

?x

ファイルを実効 uid で実行することができる

?o

ファイルの所有者が実効 uid である

?G

ファイルのグループ所有者が実効 gid である

?R

ファイルを実 uid で読むことができる

?W

ファイルに実 uid で書くことができる

?X

ファイルを実 uid で実行することができる

?O

ファイルの所有者が実 uid である

?e

ファイルが存在する

?z

ファイルサイズが 0 である

?s

ファイルサイズが 0 でない (ファイルサイズを返す、0 ならば nil) -> Integer|nil

?f

ファイルはプレーンファイルである

?d

ファイルはディレクトリである

?l

ファイルはシンボリックリンクである

?p

ファイルは名前つきパイプ(FIFO)である

?S

ファイルはソケットである

?b

ファイルはブロック特殊ファイルである

?c

ファイルはキャラクター特殊ファイルである

?u

ファイルに setuid ビットがセットされている

?g

ファイルに setgid ビットがセットされている

?k

ファイルに sticky ビットがセットされている

?M

ファイルの最終更新時刻を返す -> Time

?A

ファイルの最終アクセス時刻を返す -> Time

?C

ファイルの inode 変更時刻を返す -> Time

test(cmd, file1, file2) -> bool

2ファイル間のファイルテストを行います。

[PARAM] cmd:
以下に示す数値リテラルか文字列です(文字列の場合はその先頭の文字だけをコマンドとみなします)。
[PARAM] file1:
テストするファイルオブジェクトです。
[PARAM] file2:
テストするファイルオブジェクトです。
[RETURN]
真偽値を返します。

以下は cmd として指定できる数値リテラルとその意味です。

?=

ファイル1とファイル2の最終更新時刻が等しい

?>

ファイル1の方がファイル2より最終更新時刻が新しい

?<

ファイル1の方がファイル2より最終更新時刻が古い

?-

ファイル1とファイル2が同一のファイルである

throw(tag, value = nil) -> ()

Kernel.#catchとの組み合わせで大域脱出を行います。 throw は同じ tag を指定した catch のブロックの終わりまでジャンプします。

throw は探索時に呼び出しスタックをさかのぼるので、 ジャンプ先は同じメソッド内にあるとは限りません。 もし ensure節 が存在するならジャンプ前に実行します。

もし同じ tag で待っている catch が存在しない場合は NameError で スレッドが終了します。

同じタグであるとは Object#object_id が同じであるという意味です。

[PARAM] tag:
catch の引数に対応する任意のオブジェクトです。
[PARAM] value:
catch の戻り値になります。
[EXCEPTION] NameError:
同じ tag で待っている catch が存在しない場合に発生します。
def foo
  throw :exit, 25
end

ret = catch(:exit) do
  begin
    foo
    some_process()    # 絶対に実行されない
    10
  ensure
    puts "ensure"
  end
end
puts ret
#=> ensure
#   25

[SEE_ALSO] Kernel.#catch

trace_var(varname, hook) -> nil
trace_var(varname) {|new_val| .... } -> nil
trace_var(varname, hook) -> [String|Proc]

グローバル変数 varname への代入のフックを登録します。

ここでの「グローバル変数」は、特殊変数 (変数と定数/組み込み変数 を参照)も含めた `$' で始まる変数のこ とです。

この呼び出し以降、varname で指定したグローバル変数に 値が代入されるたびに hook かブロックが評価されます。hook が Proc オブジェクトの場合 代入された値がブロック引数に渡されます。文字列の場合はRubyコードとして評価されます。

trace_var がフックするのは明示的な代入だけです。 フックは複数登録できます。

フックを解除するには、hook に nil を 指定するか、Kernel.#untrace_var を用います。

hook が nil ならば、設定されていた hook をすべて解除してその配列を返します(ブロックで登録されていれば Proc オブジェクトで返されます) それ以外は、nil を返します。

[PARAM] varname:
グローバル変数名を文字列か Symbol で指定します。
[PARAM] hook:
フックになる文字列または Proc オブジェクトです。
[RETURN]
フックを登録した場合は nil を返します。解除した場合は解除した フックを並べた配列を返します。
trace_var(:$v){|val| puts "hook: $v=#{val.inspect}" }
$v = 1       #=> hook: $v=1
$v = "foo"   #=> hook: $v="foo"
$v.upcase!
p $v         #=> "FOO"

[SEE_ALSO] Kernel.#untrace_var

trap(signal, command) -> String | Proc | nil
trap(signal) { ... } -> String | Proc | nil

signal で指定された割り込みにたいするハンドラとして command を登録します。Signal.#trapと同じです。

Signal.#trapの使用を推奨します。

[PARAM] signal:
Signal.#trap 参照
[PARAM] command:
Signal.#trap 参照

[SEE_ALSO] Signal.#trap,Signal

untrace_var(varname, hook = nil) -> [String|Proc]

グローバル変数 varname に関連付けられたフックを解除します。

hook が指定された場合にはそのフックだけを解除します。 省略するか nil を与えた場合は varname のフックを全て解除します。

[PARAM] varname:
グローバル変数名を文字列か Symbol で指定します。
[PARAM] hook:
文字列または Proc オブジェクトです。
[RETURN]
解除されたフックの配列を返します。
trace_var(:$v){|val| print "hookA.#{val.inspect},\n" }
block = proc{|val| print "hookB.#{val.inspect}," }
trace_var(:$v,&block)
$v = 'str'        #=> hookB."str",hookA."str",

untrace_var(:$v,block)
$v = 'str'        #=> hookA."str",

trace_var(:$v){|val| print "hookC.#{val.inspect}," }
p untrace_var(:$v) #=> [#<Proc:0x02b68f58@..:9>, #<Proc:0x02b6978c@..:3>]
$v = 'str'        # なにも出力されない

[SEE_ALSO] Kernel.#trace_var

warn(message) -> nil

message を 標準エラー出力 $stderr に出力します。 $VERBOSE フラグ が nil のときは何も出力しません。

文字列以外のオブジェクトが引数として与えられた場合には、 to_s メソッドにより文字列に変換してから出力します。

このメソッドは以下と同じです。

$stderr.print message, "\n" unless $VERBOSE.nil?
[PARAM] message:
出力するオブジェクトです。
[EXCEPTION] IOError:
標準エラー出力が書き込み用にオープンされていなければ発生します。
[EXCEPTION] Errno::EXXX:
出力に失敗した場合に発生します。
warn "caution!" #=> caution!
$VERBOSE = nil
warn "caution!" # 何もしない

[SEE_ALSO] $stderr,$VERBOSE

定数

ARGF -> Object

引数 (なければ標準入力) で構成される仮想ファイル (詳細は ARGF を参照)。

つまり Kernel.#getsARGF.gets と同じ意味です。 ARGF.file で現在読み込み中のファイルオブジェクトが、 ARGF.filename で現在読み込み中のファイル名が得られます。

ARGV -> Array

Ruby スクリプトに与えられた引数を表す配列です。

組み込み変数 $* の別名です。 Ruby 自身に対する引数は取り除かれています。

例:

スクリプト argv.rb の内容が

p ARGV

であったとします。このときシェルから次を実行すると、

$ ruby argv.rb foo bar baz

結果は以下のように出力されます。

["foo", "bar", "baz"]
ARGV -> Array [redefined by optparse]

Ruby スクリプトに与えられた引数を表す配列です。

optparse を require することにより、ARGV は OptionParser::Arguable を Object#extend します。

[SEE_ALSO] OptionParser::Arguable

DATA -> File

スクリプトの __END__ プログラムの終り以降をアクセスする File オブジェクト。

プログラム・文・式/プログラムの終り も参照。

ソースファイルの __END__ 以降は解析・実行の対象にならないので その部分にプログラムが利用するためのデータを書き込んでおくことができます。 DATA 定数はそのデータ部分にアクセスするための File オブジェクトを保持しています。

__END__ を含まないプログラムにおいては DATA は定義されません。

注意

  • DATA.rewind で移動する読みとり位置は __END__ 直後ではなく、 スクリプトファイルの先頭です。
  • スクリプトが標準入力から読みこまれた場合は標準入力になります。
  • スクリプトがファイルや標準入力から読みこまれなかった場合や、 __END__ で終っていない場合には定義されません。
  • Kernel.#requireKernel.#load で 読み込まれたファイルの中であってもそのファイル (__FILE__, 変数と定数/疑似変数 ) ではなく実行されたファイル ($0) を指します。

例1

print DATA.gets # => 故人西辞黄鶴楼
print DATA.gets # => 烟花三月下揚州
print DATA.gets # => 孤帆遠影碧空尽
print DATA.gets # => 唯見長江天際流
DATA.gets       # => nil

__END__
故人西辞黄鶴楼
烟花三月下揚州
孤帆遠影碧空尽
唯見長江天際流

例2

sum = 0
DATA.each_line do |line|
  sum += line.to_i
end

DATA.rewind
p DATA.gets    # => "sum = 0¥n"

__END__
17
19
23
29
31

例3

DATA.gets    # => uninitialized constant DATA (NameError)

例4

ファイル library.rb と app.rb の内容が以下であったとします。

library.rb:

print DATA.gets

__END__
data from library

app.rb:

require 'library.rb'

__END__
data from app

このときシェルから次を実行すると

$ ruby app.rb

結果は以下のように出力されます。

data from app
ENV -> Object

環境変数を表す (疑似) 連想配列 (詳細は ENV を参照)。

この連想配列の値を変更すると子プロセスの環境として引き継がれます。

FALSE -> FalseClass

非推奨です。代表的な偽の値。false と同じ。

この定数は過去との互換性のために提供されています。擬似変数 false を使ってください。 Ruby では false と nil が偽として扱われます。 偽でない値(false でも nil でもない値) は全て真とみなされます。

NIL -> NilClass

非推奨です。 nil と同じ。

この定数は過去との互換性のために提供されています。擬似変数 nil を使ってください。

Ruby では false と nil が偽として扱われます。 偽でない値(false でも nil でもない値) は全て真とみなされます。

RUBY_COPYRIGHT -> String

Ruby のコピーライトを表す文字列。

RUBY_DESCRIPTION -> String

Ruby の詳細を表す文字列。

ruby -v で表示される内容が格納されています。

RUBY_ENGINE -> String

Ruby処理系実装の種類を表す文字列。

例:

$ ruby-1.9.1 -ve 'p RUBY_ENGINE'
ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux]
"ruby"
$ jruby -ve 'p RUBY_ENGINE'
jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java]
"jruby"
RUBY_PATCHLEVEL -> Fixnum

Ruby のパッチレベルを表す Fixnum オブジェクトです。

パッチレベルはRubyの各バージョンに対するバグ修正パッチの適用をカウントしています。 teeny リリースのそれぞれについてパッチレベルは 0 から始まり、 その teeny リリースに対してバグ修正パッチが適用される度に増えていきます。

パッチレベルという概念および RUBY_PATCHLEVEL 定数は、 Ruby 1.8.5-p1 以降、 1.8.6 以降で導入されました。 1.8.5やそれ以前のバージョンでは定義されていません。

RUBY_PLATFORM -> String

プラットフォームを表す文字列。

RUBY_RELEASE_DATE -> String

Ruby のリリース日を表す文字列。

RUBY_VERSION -> String

Ruby のバージョンを表す文字列。

Ruby のバージョンは、major.minor.teeny という形式です。 それぞれの番号は (今のところ) 2 桁以上にならないと約束されていますので、

if RUBY_VERSION >= '1.6.7'
  # バージョン 1.6.7 以降で有効な処理
else
  # それ以前のバージョンで有効な処理
end

とバージョンの違いによる処理の分岐を書くことができます。

Ruby 1.8 までは、minor が奇数のバージョンは開発版、 minor が偶数のバージョンは安定版です。 RUby 1.9.0 以降は、teeny が 0 のバージョンが開発版となる予定です。

SCRIPT_LINES__ -> Hash

ソースファイル別にまとめられたソースコードの各行。

この定数は、デフォルトでは定義されていません。 この定数がハッシュとして定義された後にソースが((*コンパイル*))されると、 そのソースファイル名をキーに、 ソースを行毎に分割した配列を値にしたハッシュ要素が設定されます。

この定数はデバッガ (debug) などで利用されています。

なお、 $SAFE レベルが 0 でなければ有効にはなりません。 また、 Kernel.#eval によるコンパイルは対象にはなりません。

例:

require 'pp'
SCRIPT_LINES__ = {}
require 'English'
pp SCRIPT_LINES__

# => {"/usr/local/lib/ruby/1.6/English.rb"=>
#     ["alias $ERROR_INFO              $!\n",
#      "alias $ERROR_POSITION          $@\n",
#      "alias $LOADED_FEATURES         $\"\n",
#               :
#               :
#      "alias $POSTMATCH               $'\n",
#      "alias $LAST_PAREN_MATCH        $+\n"]}
STDERR -> IO

標準エラー出力。$stderr のデフォルト値。 $stderr も参照してください。

STDERR は、 ruby プロセスが起動された時点での標準エラー出力を表します。 起動時点では $stderr も同じ値に初期化されています。

$stderr に他の出力オブジェクトを代入することで簡易なリダイレクトを実現できます。 そして、 $stderr に STDERR を代入すればこのリダイレクトを復元できるわけです。

注意

STDERR は ruby 自体が起動された時点での標準エラー出力です。 「システムにおける標準のエラー出力ストリーム」とは異なります。

多くのシステムでは標準のエラー出力ストリームは端末です。 ruby 自体が他のストリームに向けてエラー出力をリダイレクトされた状態で起動された場合、 STDERR が保持するのは端末ではなく、リダイレクト先のストリームです。

STDIN -> IO

標準入力。$stdin のデフォルト値。 $stdin も参照してください。

STDIN は、 ruby プロセスが起動された時点での標準入力を表します。 起動時点では $stdin も同じ値に初期化されています。

$stdin に他の入力オブジェクトを代入することで簡易なリダイレクトを実現できます。 そして、 $stdin に STDIN を代入すればこのリダイレクトを復元できるわけです。

注意

STDIN は ruby 自体が起動された時点での標準入力です。 「システムにおける標準の入力ストリーム」とは異なります。

多くのシステムでは標準の入力ストリームは端末です。 ruby 自体が他のストリームに向けて入力をリダイレクトされた状態で起動された場合、 STDIN が保持するのは端末ではなく、リダイレクト先のストリームです。

STDOUT -> IO

標準出力。$stdout のデフォルト値。 $stdout も参照してください。

STDOUT は、 ruby プロセスが起動された時点での標準出力を表します。 起動時点では $stdout も同じ値に初期化されています。

$stdout に他の出力オブジェクトを代入することで簡易なリダイレクトを実現できます。 そして、 $stdout に STDOUT を代入すればこのリダイレクトを復元できるわけです。

注意

STDOUT は ruby 自体が起動された時点での標準出力です。 「システムにおける標準の出力ストリーム」とは異なります。

多くのシステムでは標準の出力ストリームは端末です。 ruby 自体が他のストリームに向けて出力をリダイレクトされた状態で起動された場合、 STDOUT が保持するのは端末ではなく、リダイレクト先のストリームです。

TOPLEVEL_BINDING -> Binding

トップレベルでの Binding オブジェクト。

詳細は Binding を参照してください。

TRUE -> TrueClass

非推奨です。代表的な真の値。true と同じ。

この定数は過去との互換性のために提供されています。擬似変数 true を使ってください。

Ruby では false と nil が偽として扱われます。 偽でない値(false でも nil でもない値) は全て真とみなされます。

特殊変数

$! -> Exception | nil

最後に例外が発生したときの Exception オブジェクトです。 該当する例外がないときは nil です。

Kernel.#raise によって設定されます。

この変数はスレッドローカル、読み取り専用です。

$" -> [String]
$LOADED_FEATURES -> [String]

Kernel.#require でロードされたファイル名を含む配列です。

Kernel.#require で同じファイルを 複数回ロードしないようにするためのロックとして使われます。

この変数はグローバルスコープです。

$$ -> Fixnum

現在実行中の Ruby プロセスのプロセス ID です。 Process.#pid と同じです。

この変数はグローバルスコープです。

$& -> String | nil

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした文字列です。 最後のマッチが失敗していた場合には nil となります。

Regexp.last_match[0] と同じです。

この変数はローカルスコープかつスレッドローカル、読み取り専用です。 Ruby起動時の初期値は nil です。

str = '<p><a href="http://example.com">example.com</a></p>'
if %r[<a href="(.*?)">(.*?)</a>] =~ str
  p $&
end
#=> "<a href=\"http://example.com\">example.com</a>"
$' -> String | nil

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした 部分より後ろの文字列です。 最後のマッチが失敗していた場合には nil となります。

Regexp.last_match.post_match と同じです。

この変数はローカルスコープかつスレッドローカル、読み取り専用です。 Ruby起動時の初期値は nil です。

str = '<p><a href="http://example.com">example.com</a></p>'
if %r[<a href="(.*?)">(.*?)</a>] =~ str
  p $'
end
#=> "</p>"
$* -> [String]

Rubyスクリプトに与えられた引数を表す配列です。 組み込み定数 Kernel::ARGV の別名です。

Ruby 自身に対する引数は取り除かれています。

この変数はグローバルスコープです。

$+ -> String | nil

現在のスコープで最後に成功した正規表現のパターンマッチで マッチした中で最後の括弧に対応する部分文字列です。

最後のマッチが失敗していた場合には nil。 いくつかある選択型のパターンのどれがマッチしたのか分からない時に便利です。

この変数はローカルスコープかつスレッドローカルです。

$, -> String | nil

デフォルトの出力フィールド区切り文字列です。 Array#join で引数を省略した場合と、 Kernel.#print の各引数の間で出力されます。

デフォルト値は nil で、空文字列と同じ結果になります。

この変数はグローバルスコープです。

$/ -> String | nil
$-0 -> String | nil

入力レコード区切りを表す文字列です。 awk の RS 変数のように働きます。

Kernel.#gets のような「行」単位の読み込みメソッドが「行」の区切りとして使用します。 Rubyがコマンドオプション -0 付きで起動されたときには -0 で指定された値が規定値となります。そうでないとき、規定値は "\n" です。

この変数に nil を設定すると読み込みメソッドはファイル全体を一度に読み込みます。 空文字列 "" を設定するとパラグラフモードとみなされ、 2 つ以上連続した改行が「行」の区切りになります。

$/ には正規表現は使えません。

この変数はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$; -> Regexp | String | nil
$-F -> Regexp | String | nil

String#split で引数を省略した場合の区切り文字です。

nilを設定すると特殊な分割を行います。 詳細は String#split を参照してください。

コマンドラインオプション -F を指定して Ruby を起動した場合、 初期値は -F で指定した値です。 それ以外の時には初期値は nil です。

$; には任意のオブジェクトを代入できます。 ただし、String#split の仕様変更を考慮すると 常に正規表現を指定すべきです。

Ruby のバージョンによらず動作するプログラムを書くときは $; に頼らないコードを書くべきです。

この変数はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$: -> [String]
$LOAD_PATH -> [String]
$-I -> [String]

Rubyライブラリをロードするときの検索パスです。

Kernel.#loadKernel.#require がファイルをロードする時に検索するディレクトリのリストを含む配列です。

起動時にはコマンドラインオプション -I で指定したディレクトリ、 環境変数 RUBYLIB の値、 コンパイル時に指定したデフォルト値、 "." (カレントディレクトリ) をこの順番で含みます。

以下に典型的な UNIX システム上でのロードパスを示します。

-I で指定したパス
環境変数 RUBYLIB の値
/usr/local/lib/ruby/site_ruby/VERSION        サイト固有、バージョン依存のライブラリ
/usr/local/lib/ruby/site_ruby/VERSION/ARCH   サイト固有、システム依存、拡張ライブラリ
/usr/local/lib/ruby/site_ruby                サイト固有ライブラリ
/usr/local/lib/ruby/VERSION                  標準ライブラリ
/usr/local/lib/ruby/VERSION/ARCH             標準、システム依存、拡張ライブラリ
.                                            カレントディレクトリ

上記表中の VERSION は Ruby のバージョンを表す文字列で、 「1.6」や「1.8」です。 ARCH はハードウェアと OS を表す文字列で、 「i686-linux」や「alpha-osf5.1」などです。 ARCH の値は Config::CONFIG['arch'] で得られます。

コンパイル時のデフォルトパスは 多くの UNIX システムでは "/usr/local/lib/ruby" です。 mswin32mingw32Cygwinbccwin32mswince 環境では ruby.dll の位置からの相対で決まります。 DJGPPemx (OS/2) では ruby.exe の位置からの相対で決まります。

-T オプションで起動時に $SAFE を 1 以上に 設定したときは "." (カレントディレクトリ) はロードパスに入りません。

require 'foo' を実行すると、 以下のように foo.rb と foo.so が交互に探索されます。

/usr/local/lib/ruby/site_ruby/VERSION/foo.rb
/usr/local/lib/ruby/site_ruby/VERSION/foo.so
/usr/local/lib/ruby/site_ruby/VERSION/ARCH/foo.rb
/usr/local/lib/ruby/site_ruby/VERSION/ARCH/foo.so
  :
  :

なお、共有ライブラリの拡張子が .so でないシステムでは 「.so」が適切な拡張子に変更されます。 例えば HP-UX では require 'foo.so' とすると foo.sl を検索します。 したがって Ruby で記述されたコードでは常に .so を使うべきです。

なお、ロードパスをコマンドラインから調べるには

$ ruby -e 'puts $:'

とします。

この変数はグローバルスコープです。

[SEE_ALSO] Rubyの起動, 環境変数

$KCODE -> nil
$-K -> nil

この特殊変数は何の影響も持たなくなりました。

値を代入しても無視され、参照すると常に nil です。

>> $KCODE = true
(irb):1: warning: variable $KCODE is no longer effective; ignored
=> true
>> $KCODE
(irb):2: warning: variable $KCODE is no longer effective
=> nil

[SEE_ALSO] Rubyの起動

$-W -> 0 | 1 | 2

コマンドラインオプション -W を指定したとき、 そのコマンドライン引数の値が設定されます。

つまり、$VERBOSE の値によって以下の値を返します。

nil

0。警告を出力しない。

false

1。重要な警告のみ出力する。(デフォルト)

true

2。すべての警告を出力する。

この変数には代入できません。

この変数はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$-a -> bool

自動 split モードを表すフラグです。

コマンドラインオプション -a を使ったとき true に設定されます。 この変数には代入できません。

この変数はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$DEBUG -> bool
$-d -> bool

この値が真のときはインタプリタがデバッグモードになります。

コマンドラインオプション -d でセットされます。 スクリプトから代入することもできます。

デバッグモードでは、通常モードに比べて以下の違いがあります。

  • 通常時はいずれかのスレッドが例外によって終了しても 他のスレッドは実行を続けますが、デバッグモードでは いずれかのスレッドが例外によって終了した時に インタプリタ全体が中断されるようになります。 Thread.abort_on_exception を true にセットするのと同じ効果です。
  • Thread.abort_on_exception= の効果がなくなります。
  • 例外を捕捉しているかどうかに関係なく、 例外が発生した時点で $stderr にそれが出力されます。 スクリプトの処理は続行されます。

この変数はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$-i -> bool

in-place 置換モードで用いられます。

コマンドラインオプション -i を指定したとき、空文字列になります。 -i オプションに拡張子を渡した場合にはその拡張子が文字列として格納されます。

-i オプションが指定されていない時の値は nil です。

スクリプト内で $-i に代入することもでき、 その場合は Kernel::ARGV の次の ファイルを読み込み始めるタイミングで in-place 置換を開始します。

この変数はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$-l -> bool

コマンドラインオプション -l を指定したとき true に設定されます。 この変数には代入できません。

この変数はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$-p -> bool

コマンドラインオプション -p を指定したとき true に設定されます。 この変数には代入できません。

この変数はグローバルスコープです。

$VERBOSE -> bool | nil
$-v -> bool | nil
$-w -> bool | nil

冗長メッセージフラグです。Rubyインタプリタへの コマンドラインオプション -v でセットされます。

警告レベルは三段階あり、それぞれ以下の通りです。

nil

警告を出力しない

false

重要な警告のみ出力 (デフォルト)

true

すべての警告を出力する

$VERBOSE に nil, false 以外を代入すると値は true になります。

$VERBOSE の値はコマンドラインオプション -W でも設定できます。 -W0 オプションで nil、 -W1 オプションで false、 -W2, -W オプションで true が設定されます。 -v オプションや -w オプションを指定した場合は true が設定されます。

$VERBOSE はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$. -> Fixnum

いずれかの IO オブジェクトが最後に読んだ行の行番号です。 Kernel::ARGF などの IO 互換のオブジェクトも $. を更新します。

IO からの読み込みが起きるタイミングが予測不能であるような複雑なプログラムでは使用すべきではありません。特に、マルチスレッドプログラムではスレッド間で競合を起こす可能性があります。 そのような場合には、 IO#lineno を使用してください。

この変数はグローバルスコープです。 Ruby起動時の初期値は 0 です。

$0 -> String
$PROGRAM_NAME -> String

現在実行中の Ruby スクリプトの名前を表す文字列です。

OS と Ruby のバージョンによっては、この変数に代入すると ps(1) の出力が変化します。 この機能はプログラムの現在の状態を表示するのに便利です。

この変数はグローバルスコープです。

$1 -> String | nil
$2 -> String | nil
$3 -> String | nil
$4 -> String | nil
$5 -> String | nil
$6 -> String | nil
$7 -> String | nil
$8 -> String | nil
$9 -> String | nil
$10 -> String | nil
$11 -> String | nil

最後に成功したパターンマッチで n 番目の括弧にマッチした値が格納されます。 該当する括弧がなければ nil が入っています。(覚え方: \数字 のようなもの)

番号 n はいくらでも大きな正整数を利用できます。

Regexp.last_match[1], Regexp.last_match[2], ... と同じ。

これらの変数はローカルスコープかつスレッドローカル、読み取り専用です。

str = '<p><a href="http://example.com">example.com</a></p>'
if %r[<a href="(.*?)">(.*?)</a>] =~ str
  print $1
  print $2
end
#=> "http://example.com"
#=> "example.com"
$< -> IO

すべての引数または標準入力で構成される仮想ファイルです。 定数 Kernel::ARGF の別名です。

この変数はグローバルスコープ、読み取り専用です。

$= -> bool

過去との互換性のために残されていますが、もはや何の意味もありません。

値は常に false です。代入しても無視されます。

この変数はグローバルスコープです。

$> -> object
$stdout -> object

標準出力です。

組み込み関数 Kernel.#printKernel.#putsKernel.#p などのデフォルトの出力先となります。 初期値は Kernel::STDOUT です。 コマンドラインオプションオプション -i を指定した場合には 読み込み元と同じ名前のファイルを表します。

$stdout に代入するオブジェクトには write という名前のメソッドが定義されていなければいけません。

自プロセスの標準出力をリダイレクトしたいときには、 以下のように $stdout に代入すれば十分です。

# 標準出力の出力先を /tmp/foo に変更
$stdout = File.open("/tmp/foo", "w")
puts "foo"         # 出力する
$stdout = STDOUT   # 元に戻す

自プロセスだけでなく、子プロセスの標準出力もリダイレクトしたいときは 以下のように IO#reopen を使います。

STDOUT.reopen("/tmp/foo", "w")

また、リダイレクトしたあと 出力先をまた元に戻したい場合は以下のようにします。

stdout_old = $stdout.dup        # 元の $stdout を保存する
$stdout.reopen("/tmp/foo")      # $stdout を /tmp/foo にリダイレクトする
puts "foo"                      # /tmp/foo に出力
$stdout.flush                   # 念のためフラッシュする
$stdout.reopen stdout_old       # 元に戻す

$stdout はグローバルスコープです。

[SEE_ALSO] Rubyの起動

$? -> Process::Status | nil

このスレッドで最後に終了した子プロセスのステータスです。

Process::Status オブジェクトが入っています。 子プロセスの終了時ステータスは Process::Status#exitstatus で得られます。

この変数はスレッドローカルで読み取り専用です。

[SEE_ALSO] Process.#wait

$@ -> [String] | nil

最後に例外が発生した時のバックトレースを表す配列です。 Kernel.#raise によって設定されます。

配列の各要素はメソッドの呼び出し位置を示す文字列で形式は

"filename:line"

または

"filename:line:in `methodname'"

です。これは Kernel.#caller が返す値と同じ形式です。

$@ へ値を代入するときは、$! が nil であってはいけません。 $@ の値は、$!.backtrace の値と同じです。 また、$@ への代入は $!.set_backtrace 呼び出しと同じです。

文字列の配列でも nil でもない値を代入しようとすると、 TypeError 例外が発生します。

この変数はスレッドローカルです。

$FILENAME -> String

仮想ファイル Kernel::ARGF で現在読み込み中のファイル名です。 ARGF.filename と同じです。

この変数はグローバルスコープです。

$SAFE -> Fixnum

カレントスレッドのセーフレベルを表す整数です。セーフレベルについては セキュリティモデル を参照してください。

Thread.current.safe_level と同じです。 非整数を代入しようとすると TypeError が発生します。

この変数はスレッドローカルです。 Ruby起動時の初期値は 0 です。

$\ -> String | nil

出力レコード区切りを表す文字列です。 Kernel.#print が最後にこの文字列を出力します。

デフォルトは nil で、何も出力しません。

この変数はグローバルスコープです。

$_ -> String | nil

最後に Kernel.#gets または Kernel.#readline で読み込んだ文字列です。 EOF に達した場合には、 nil になります。 (覚え方: Perlと同じ)

Kernel.#print のような Perl 由来の幾つかのメソッドは、引数を省略すると代わりに $_ を利用します。

この変数はローカルスコープかつスレッドローカルです。 Ruby起動時の初期値は nil です。

[SEE_ALSO] Kernel.#print, Kernel.#gets, Kernel.#readline, Kernel::ARGF

example.txt:

foo
bar
baz

このとき、コマンド ruby -e 'print while gets' example.txt は次を出力します

foo
bar
baz

ただし、このプログラムは次のように書く方がよりRuby的です。

ARGF.each do |line|
  print line
end
$` -> String | nil

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした 部分より前の文字列です。 最後のマッチが失敗していた場合には nil となります。

Regexp.last_match.pre_match と同じです。

この変数はローカルスコープかつスレッドローカル、読み取り専用です。 Ruby起動時の初期値は nil です。

str = '<p><a href="http://example.com">example.com</a></p>'
if %r[<a href="(.*?)">(.*?)</a>] =~ str
  p $`
end
#=> "<p>"
$stderr -> object

標準エラー出力です。

Ruby インタプリタが出力するエラーメッセージや 警告メッセージ、Kernel.#warn の出力先となります。 初期値は Kernel::STDERR です。

$stderr に代入するオブジェクトには write という名前のメソッドが定義されていなければいけません。

自プロセスの標準エラー出力をリダイレクトしたいときには、 $stderr に代入すれば十分です。

# 標準エラー出力の出力先を /tmp/foo に変更
$stderr = File.open("/tmp/foo", "w")
puts "foo"         # 出力する
$stderr = STDERR   # 元に戻す

自プロセスだけでなく、子プロセスの標準エラー出力も リダイレクトしたいときは以下のように IO#reopen を使います。

$stderr.reopen("/tmp/foo", "w")

また、リダイレクトしたあと 出力先をまた元に戻したい場合は以下のようにします。

stderr_old = $stderr.dup        # 元の $stderr を保存する
$stderr.reopen("/tmp/foo")      # $stderr を /tmp/foo にリダイレクトする
puts "foo"                      # /tmp/foo に出力
$stderr.flush                   # 念のためフラッシュする
$stderr.reopen stderr_old       # 元に戻す

$stderr はグローバルスコープです。

$stdin -> object

標準入力です。

自プロセスの標準入力をリダイレクトしたいときは $stdin に代入すれば十分です。

# 標準入力の入力元 /tmp/foo に変更
$stdin = File.open("/tmp/foo", "w")
gets               # 入力する
$stdin = STDIN     # 元に戻す

ただし、Kernel.#gets など、特定の組み込みメソッドは $stdin オブジェクトにメソッドを転送して実装されています。 従って、Kernel.#gets などが正しく動作するには、 $stdin オブジェクトに代入したオブジェクトが以下のメソッドを 正しく実装していなければいけません。

gets, readline, readlines, getc, readchar, tell, seek,
pos=, rewind, fileno, to_io, eof, each_line, each_byte,
binmode, closed?

例:

$stdin = Object.new
def $stdin.gets
  "foo"
end
p gets()  # => "foo"

自プロセスだけでなく、子プロセスの標準入力もリダイレクトしたいときは 以下のように IO#reopen を使います。

$stdin.reopen("/tmp/foo")

また、リダイレクトしたあと 出力先をまた元に戻したい場合は以下のようにします。

stdin_old = $stdin.dup       # 元の $stdin を保存する
$stdout.reopen("/tmp/foo")   # $stdin を /tmp/foo にリダイレクトする
gets                         # /tmp/foo から入力
$stdin.reopen stdin_old      # 元に戻す

$stdin はグローバルスコープです。

$~ -> MatchData | nil

現在のスコープで最後に成功したマッチに関する MatchDataオブジェクトです。 Regexp.last_match の別名です。

このデータから n 番目のマッチ ($n) を取り出すためには $~[n] を使います。

この値に代入すると Regexp.last_match や、 $&, $1, $2, ... などの関連する組み込み変数の値が変化します。 MatchData オブジェクトでも nil でもない値を代入しようとすると TypeError が発生します。

この変数はローカルスコープかつスレッドローカルです。 Ruby起動時の初期値は nil です。

str = '<p><a href="http://example.com">example.com</a></p>'
if %r[<a href="(.*?)">(.*?)</a>] =~ str
  p $~[1]
end
#=> "http://example.com"
class IRB::ExtendCommand::Foreground