この規格ページの目次
10
X 3017 : 2013 (ISO/IEC 30170 : 2012)
ドAND式》又は《演算子AND式》が表す文字の並びが《論理AND式》であるとみなされること
はない。しかし,《キーワードAND式》及び《演算子AND式》は,同じような意味規則をもつ
ため,それらをまとめて《論理AND式》の意味規則として記述する。意味規則において,“《論
理AND式》”は,《キーワードAND式》又は《演算子AND式》が表すプログラム構成要素を示
す。
5.4 実行環境の属性
実行環境(7.1参照)の属性の名前は,二重亀甲括弧( )で囲んで表示する。
例 self は実行環境の属性の一つである。
6 基本概念
6.1 オブジェクト
オブジェクトは,状態及び動作をもつ。オブジェクトの状態は,そのオブジェクトの属性によって表現
される。全てのオブジェクトは,インスタンス変数の束縛(6.2.2参照)の集合を,そのオブジェクトの属
性としてもつ。オブジェクトは,そのオブジェクトのクラスによっては,インスタンス変数の集合に加え
て,幾つかの他の属性をもつことができる。オブジェクトの動作は,そのオブジェクトに対して呼び出す
ことができるメソッド(6.3参照)の集合によって定義される。メソッドは,クラス,特異クラス又はモジ
ュール(6.5参照)の中に定義される。
プログラムによって直接操作される全ての値は,オブジェクトである。例えば,次の値は全てオブジェ
クトである。
− 変数(6.2参照)によって参照される値。
− 実引数としてメソッドに渡される値。
− メソッドによって返される値。
− 《式》(箇条11参照),《文》(箇条12参照),《複合文》(10.2参照)又は《プログラム》(10.1参照)の
評価結果として返される値。
その他の値は,その値がオブジェクトとして明示的に規定されていない限り,オブジェクトではない。
注記 この規格では,整数のような基本的な値もまたオブジェクトである。例えば,《整数リテラル》
(8.7.6.2参照)の評価結果は,オブジェクトである。
6.2 変数
6.2.1 概要
変数は名前によって表され,オブジェクトを参照する。そのオブジェクトは,その変数の値と呼ばれる。
変数自身はオブジェクトではない。一つの変数は一つのオブジェクトしか同時に参照できないが,一つの
オブジェクトは二つ以上の変数によって同時に参照できる。
変数があるオブジェクトを参照している場合,その変数はそのオブジェクトに束縛されているという。
この変数とオブジェクトとの結び付きを,変数束縛と呼ぶ。名前Nの変数が,オブジェクトOに束縛され
ているとき,Nをその束縛の名前と呼び,Oをその束縛の値と呼ぶ。
変数には,次の五つの種類がある。
− インスタンス変数(6.2.2参照),その名前は一つの “@” で始まる(例 : “@var”)。
− 定数(6.5.2参照),その名前は大文字で始まる(例 : “Const”)。
− クラス変数(6.5.2参照),その名前は“@@” で始まる(例 : “@@var”)。
− 局所変数(9.2参照),その名前は小文字又は “” で始まる(例 : “var”又は“var”)。
――――― [JIS X 3017 pdf 16] ―――――
11
X 3017 : 2013 (ISO/IEC 30170 : 2012)
− 大域変数(9.3参照),その名前は“$” で始まる(例 : “$var”)。
任意の変数は,任意の種類のオブジェクトに束縛されることができる。
例 次のプログラムでは,局所変数 “x” は,まず整数を参照し,次に文字列を参照し,最後に配列を
参照する。
x = 123
x = "abc"
x = [1, 2, 3]
6.2.2 インスタンス変数
オブジェクトは,変数束縛の集合をもつ。この変数束縛の集合の中にある変数は,そのオブジェクトの
インスタンス変数である。インスタンス変数の束縛の集合は,オブジェクトの状態を表す。
あるオブジェクトのインスタンス変数には,そのオブジェクトの外側では直接にはアクセスできない。
インスタンス変数には,通常アクセサと呼ばれるメソッドを介してアクセスする。この意味で,インスタ
ンス変数の束縛の集合は,オブジェクト内にカプセル化されている。
例 次のプログラムでは,ValueHolderクラスのインスタンス変数 “@value” が,initialize
メソッドによって初期化され(15.2.3.3.1参照),アクセサメソッドvalueを介してアクセスされ,
Kernelモジュールのputsメソッド(15.3.1.2.11参照)によって出力される。“#” 以降のテキス
トはコメント(8.5参照)である。
class ValueHolder
def initialize(value)
@value = value
end
def value
return @value
end
end
vh = ValueHolder.new(10) # initialize(10)が呼ばれる。
puts vh.value
6.3 メソッド
メソッドは,オブジェクトに対して呼び出されたときに,そのオブジェクトに対する一連の計算を実行
する手続きである。メソッド自身はオブジェクトではない。オブジェクトに対し呼出し可能なメソッドの
集合によって,そのオブジェクトの動作が定義される。メソッドは一つの名前(又は,別名がある場合は
複数の名前)をもつ。この名前とメソッドとの関係をメソッド束縛と呼ぶ。名前NがメソッドMに束縛さ
れている場合,Nをその束縛の名前と呼び,Mをその束縛の値と呼ぶ。ある名前にメソッドが束縛されて
いるとき,その名前をそのメソッドのメソッド名と呼ぶ。オブジェクトに対してメソッド名の一つを指定
することによって,メソッドを呼び出すことができる。メソッド呼出しの対象となるオブジェクトを,メ
ソッド呼出しのレシーバと呼ぶ。
例 メソッド呼出し “obj.method(arg1, arg2)” において,“obj” をレシーバと呼び,“method”
をメソッド名と呼ぶ。メソッド呼出し式については,11.3を参照。
――――― [JIS X 3017 pdf 17] ―――――
12
X 3017 : 2013 (ISO/IEC 30170 : 2012)
メソッドについては,13.3でより詳しく示す。
6.4 ブロック
ブロックは,メソッド呼出しに渡される手続きである。メソッド呼出しに渡されたブロックは,そのメ
ソッド呼出しの中で0回以上呼び出される。
ブロック自身はオブジェクトではない。ただし,ブロックは,Procクラス(15.2.17参照)のインスタ
ンスであるオブジェクトによって表現することができる。
例1 次のプログラムでは,配列のそれぞれの要素について,Arrayクラスのeachメソッド
(15.2.12.5.10参照)によってブロック “[{ |i| puts i}]” が呼び出される。
a = [1, 2, 3]
a.each [{ |i| puts i}]
例2 次のプログラムでは,ブロック “[{ puts "abc"}]” を表すProcクラスのインスタンスが作
成され,Procクラスのcallメソッド(15.2.17.4.3参照)によって呼び出される。
x = Proc.new [{ puts "abc"}]
x.call
ブロックについては,11.3.3でより詳しく示す。
6.5 クラス,特異クラス及びモジュール
6.5.1 概要
オブジェクトの動作は,クラス,特異クラス及びモジュールによって定義される。クラスは,同じクラ
スのオブジェクトで共有されるメソッドを定義する。特異クラスは,他のオブジェクトと関連付けられ,
そのオブジェクトの動作に修正を加えることができる。モジュールは,クラス及び他のモジュールにイン
クルードされるメソッドを定義し,提供する。クラス,特異クラス及びモジュールは,それら自身がオブ
ジェクトであり,実行時に動的に生成されたり,修正が加えられる。
6.5.2 クラス
クラスはそれ自身オブジェクトであるが,他のオブジェクトを生成する。生成されたオブジェクトを,
そのクラスの直接のインスタンスであるという(13.2.4参照)。
クラスはメソッドの集合を定義する。それらのメソッドは,上書き(13.3.1参照)されていない限り,
そのクラスの全てのインスタンスに対して呼び出すことができる。これらのメソッドはクラスのインスタ
ンスメソッドである。
クラス自身もオブジェクトであり,《クラス定義》(13.2.2参照)などのプログラム構成要素を評価する
ことによって生成される。クラスは,インスタンス変数束縛の集合のほかに,二つの変数束縛の集合をも
つ。一つは定数束縛の集合であり,もう一つはクラス変数束縛の集合である。クラス変数束縛の集合は,
クラスの全てのインスタンスで共有される状態を表現する。
クラスのもつ定数,クラス変数,特異メソッド及びインスタンスメソッドを,そのクラスの機能と呼ぶ。
例1 Arrayクラス(15.2.12参照)はそれ自身オブジェクトであり,メソッド呼出しのレシーバとな
ることができる。Array クラスに対するnew メソッドの呼出しは,Array クラスの直接の
インスタンスと呼ばれるオブジェクトを作成する。
例2 次のプログラムでは,Array クラスのインスタンスメソッドpush(15.2.12.5.22参照)がArray
クラスのインスタンスに対して呼び出される。
a = Array.new
a.push(1, 2, 3) # aの値は[1, 2, 3]となる。
――――― [JIS X 3017 pdf 18] ―――――
13
X 3017 : 2013 (ISO/IEC 30170 : 2012)
例3 次のプログラムでは,クラス定義によってXクラスが定義される。クラス変数 “@@a” は,X
クラスのインスタンス群で共有される。
class X
@@a = "abc"
def printa
puts @@a
end
def seta(value)
@@a = value
end
end
x1 = X.new
x1.printa # abc を出力する。
x2 = X.new
x2.seta("def")
x2.printa # def を出力する。
x1.printa # def を出力する。
クラスについては,13.2でより詳しく示す。
6.5.3 特異クラス
クラスを含む全てのオブジェクトは,高々一つの特異クラスと関連付けることができる。特異クラスは,
そのオブジェクトに対して呼び出すことのできるメソッドを定義する。それらのメソッドは,そのオブジ
ェクトの特異メソッドである。
− あるオブジェクトがクラスではない場合,そのオブジェクトの特異メソッドは,そのオブジェクトに
対してだけ呼び出すことができる。
− あるオブジェクトがクラスである場合,そのクラスの特異メソッドは,そのクラスのサブクラス及び
そのクラス自身に対してだけ呼び出すことができる(6.5.4参照)。
特異クラスは,特異クラス定義(13.4.2参照)又は特異メソッド定義(13.4.3参照)によって作成され,
オブジェクトと関連付けられる。
例1 次のプログラムでは,特異クラス定義によって “x” の特異クラスが作成される。showメソッ
ドは,“x” の特異メソッドと呼び,“x” に対してだけ呼び出すことができる。
x = "abc"
y = "def"
# x の特異クラスの定義
class << x
def show
puts self # レシーバを出力する。
end
――――― [JIS X 3017 pdf 19] ―――――
14
X 3017 : 2013 (ISO/IEC 30170 : 2012)
end
x.show # abc を出力する。
y.show # 例外が発生する。
例2 次のプログラムでは,特異メソッド定義によって,例1と同じ特異メソッドshowが定義され
る。“x” の特異クラスは,特異メソッド定義によって暗黙のうちに作成される。
x = "abc"
# x の特異メソッドの定義
def x.show
puts self # レシーバを出力する。
end
x.show # abc を出力する。
例3 次のプログラムでは,特異メソッド定義によって,Xクラスの特異メソッドaが定義される。
class X
# X クラスの特異メソッドの定義
def X.a
puts "a メソッドが呼び出された。"
end
end
X.a # "a メソッドが呼び出された。" を出力する。
注記 クラスの特異メソッドは,クラスに対して呼び出すことができるので,他のオブジェクト指向
言語でのいわゆるクラスメソッドと類似している。
特異クラスについては,13.4でより詳しく示す。
6.5.4 継承
クラスは,高々一つのクラスをその直接のスーパークラスとしてもつ。クラスAがクラスBをその直接
のスーパークラスとしてもつ場合,AはBの直接のサブクラスという。
あるプログラムで定義される全てのクラス(組込みクラスを含む。)は,クラス継承木と呼ばれる根付き
木構造を形成する。クラス継承木において,あるクラスの親はそのクラスの直接のスーパークラスとし,
あるクラスの子はそのクラスの直接のサブクラスとする。スーパークラスをもたないクラスは,一つだけ
あり,そのクラスはクラス継承木の根である。クラス継承木において,あるクラスの全ての祖先をそのク
ラスのスーパークラスと呼び,あるクラスの全ての子孫をそのクラスのサブクラスと呼ぶ。
クラスは,スーパークラスをもつ場合,定数,クラス変数,特異メソッド及びインスタンスメソッドを
そのスーパークラスから継承する(13.2.3参照)。オブジェクトCがクラスDの直接のインスタンスであ
る場合,Cは,D及びDの全てのスーパークラスに対して,そのインスタンスであるという。
例 次のプログラムは,三つのクラス,Xクラス,Yクラス及びZクラスを定義する。
class X
end
class Y < X
――――― [JIS X 3017 pdf 20] ―――――
次のページ PDF 21
JIS X 3017:2013の引用国際規格 ISO 一覧
- ISO/IEC 30170:2012(IDT)
JIS X 3017:2013の国際規格 ICS 分類一覧
- 35 : 情報技術.事務機械 > 35.060 : 情報技術に使用される言語