この章ではメソッドの探索と起動について話す。 メソッドの探索 用語 この章ではメソッド呼び出しとメソッド定義の話を両方やる関係で、 実に様々な「引数」が出てくる。そこで紛らわしくならないように ここで厳密に用語を決めてしまうことにしよう。 m(a) # aは「通常の引数」 m(*list) # listは「配列引数」 m(&block) # blockは「ブロック引数」 def m(a) # aは「通常のパラメータ」 def m(a=nil) # aは「オプションパラメータ」、nilは「そのデフォルト値」 def m(*rest) # restは「restパラメータ」 def m(&block) # blockは「ブロックパラメータ」 ようするに渡すときは全部「引数」、受けるほうは全部「パラメータ」で 種類によってそれぞれ形容詞を付ける、ということだ。 ただし、ここで挙げたうち「ブロック引
概要 理論のように、スキャナはただひたすらトークンに区切り、パーサはその並び だけを扱い、両者は完璧に独立している……という段階で済むならば、それは とてもありがたいことだ。しかし現実はそううまくはいかない。プログラムの 文脈によってトークンの切りかたや記号を変えなければならないということは よくある。この章ではスキャナとパーサの連携について見ていくことにする。 具体例 普通のプログラム言語なら、空白は単語の区切りになる以外はたいし て意味を持たない。しかしRubyは普通ではないので空白のあるなしで全く意味 が変わってしまうことがある。例えば次のような場合だ。 a[i] = 1 # a[i] = (1) a [i] # a([i]) 前者はインデックス代入であり、後者はメソッド呼び出しの括弧を省略して引 数に配列の要素を渡している。 また次のような場合もある。 a + 1 # (a) +
本章の概要 Rubyの変数 Rubyには以下のようにかなりたくさんの種類の変数・定数が存在する。 スコープの大きいほうから並べよう。 グローバル変数 定数 クラス変数 インスタンス変数 ローカル変数 インスタンス変数については既に第2章『オブジェクト』で説明した。 本章では残りのうち グローバル変数 クラス変数 定数 について解説する。 また残るローカル変数については第三部で話す。 変数関連API 本章の解析対象はvariable.cである。 まずそこからエントリポイントとなるAPIを紹介しておこう。 VALUE rb_iv_get(VALUE obj, char *name) VALUE rb_ivar_get(VALUE obj, ID name) VALUE rb_iv_set(VALUE obj, char *name, VALUE val) VALUE rb_ivar_set(V
例えば文字列オブジェクトならstruct RStringを使うので 図2のようになる。 図2: 文字列オブジェクトの表現 オブジェクト構造体の定義をいくつか見てみよう。 ▼オブジェクト構造体の例 /* 一般のオブジェクトのための構造体 */ 295 struct RObject { 296 struct RBasic basic; 297 struct st_table *iv_tbl; 298 }; /* 文字列(Stringのインスタンス)のための構造体 */ 314 struct RString { 315 struct RBasic basic; 316 long len; 317 char *ptr; 318 union { 319 long capa; 320 VALUE shared; 321 } aux; 322 }; /* 配列(Arrayのインスタンス)のための構造体
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く