るりま作業 (備忘録)

FalseClass をサンプルにどう書くかを検討。疑問点として FalseClass には to_s メソドが定義されているようなんだけれど、どうするか、とか #@todo の部分だけ手を入れるという事か、等のナニがありましたが、ML に流れている情報として

  • 第2段階でクラスメソッドのエントリと引数は揃っているはず

との事にてそれを信用する事に。又、

  • ドキュメントの質について (あまり) 考えなくて良い

との事で、co してどんどん書いた方が良さげかも。とりあえず検討なログを以下に。
revision 1499 の FalseClass のソースは以下。(載せて良いのかなぁ)

= class FalseClass < Object

false のクラス。
false は FalseClass クラスの唯一のインスタンスです。
false は nil オブジェクトとともに偽を表し、
その他の全てのオブジェクトは真です。

== Instance Methods

--- &(other)
#@todo

常に false を返します。

--- |(other)
#@todo

other が真なら true を, 偽なら false を返します。

--- ^(other)
#@todo

other が真なら true を, 偽なら false を返します。

FalseClass 関連については、Rubyソースコード完全解説第2章 オブジェクトの_VALUE埋め込みオブジェクト_の項に記述あり。

メソッドの要約

それぞれ簡潔に要約が記述されているのでスルー。

引数の情報

例えば & メソドだと

@param other 論理積を行なう式です。

なんか微妙。

@param other 式です。

では簡潔スギ。

注意事項

& メソドだとこんな感じ??

false は FalseClass の唯一のオブジェクトです。又、Ruby では false または nil だけが偽で、それ以外は 0 や空文字列も含め全て真です。

む、重複しているな。略して良いのだろうか。

再定義可能な演算子、な説明は入れた方が良いのかな??
ってーか、今気づいたのですが、ruby って条件式で & とか | とか使えるのか。びっくり。

再定義、なナニは略で使用例に入れた方が良い??

& は再定義可能な演算子に分類されていますので、false & other のような使い方も可能です。

これは使用例で書いてあった方が良いか。でも書き方が分からねぇ。

使用例

& メソドだと例えば以下??

   p false.&(true)   #=> false
   p false.&(false)  #=> false
   p false.&(nil)    #=> false
   p false.&(1 == 1) #=> false

まとめてみる

エントリ入れるんだったら更新せい、というツッコミはスルーで試しに書いてみる。

= class FalseClass < Object

false のクラス。
false は FalseClass クラスの唯一のインスタンスです。
false は nil オブジェクトとともに偽を表し、
その他の全てのオブジェクトは真です。

== Instance Methods

--- &(other)
#@todo

常に false を返します。

@param other 論理積を行なう式です。

& は再定義可能な演算子に分類されていますので、false & other のように使うこともできます。

   p false.&(true)    #=> false
   p false.&(false)   #=> false
   p false.&(nil)     #=> false
   p false.&(1 == 1)  #=> false
   p false.&(1 + 1)   #=> false

   p false & true     #=> false
   p false & false    #=> false
   p false & nil      #=> false
   p false & (1 == 1) #=> false
   p false & (1 + 1)  #=> false

--- |(other)
#@todo

other が真なら true を, 偽なら false を返します。

@param other 論理和を行なう式です。

| は再定義可能な演算子に分類されていますので、false | other のように使うこともできます。

   p false.|(true)    #=> true
   p false.|(false)   #=> false
   p false.|(nil)     #=> false
   p false.|(1 == 1)  #=> true
   p false.|(1 + 1)   #=> true

   p false | true     #=> true
   p false | false    #=> false
   p false | nil      #=> false
   p false | (1 == 1) #=> true
   p false | (1 + 1)  #=> true

--- ^(other)
#@todo

other が真なら true を, 偽なら false を返します。

@param other 排他的論理和を行なう式です。

^ は再定義可能な演算子に分類されていますので、false | other のように使うこともできます。

   p false.^(true)    #=> true
   p false.^(false)   #=> false
   p false.^(nil)     #=> false
   p false.^(1 == 1)  #=> true
   p false.^(1 + 1)   #=> true

   p false ^ true     #=> true
   p false ^ false    #=> false
   p false ^ nil      #=> false
   p false ^ (1 == 1) #=> true
   p false ^ (1 + 1)  #=> true

NilClass とか TrueClass もこれ式で ASSIGN して コミットしてみるか。ってか、svn でコミットってどうやるんだったか (を
# ci だった (恥

で、そういった意味では ci の方法について、るりま方式を調べておいた方が良さげ。とりあえず、svn log を見る限りでは

  • assign した時のコメントは
    • assign ライブラリ to ユーザ ID
  • ci する時のコメントは
    • ライブラリ done

みたいな感じに見えます。誰か ci してから、なーんてアマいかなぁ。えいや、で作業してみて ML にお伺いかなぁ。(困

追記

そういえば、トレイスな資料として Rubyソースコード完全解説 も見つつだったのですが (参考になったのは「第2章 オブジェクト」です)、こういった作業をしながら色々調べてると本当に勉強になる。
例えば FalseClass を例にとると (これはおそらく true や nil も同様のはず)

  • object.c の中の Init_Object() にてクラスが作られている (rb_define_class による)
  • allocate や new というメソドを undef する事によりインスタンスの生成ができない形にしている
  • インスタンスメソッドの & とか | とか ^ なども object.c 内にて定義
  • 青木さんのナニによると、VALUE 埋め込みオブジェクトという形で実装されている

などなど。

例えば、青木さんのソレにて ruby.h で値が宣言などとあって ruby.h を見てみると

/* special contants - i.e. non-zero and non-fixnum constants */
#define Qfalse ((VALUE)0)
#define Qtrue  ((VALUE)2)
#define Qnil   ((VALUE)4)
#define Qundef ((VALUE)6)       /* undefined value for placeholder */

#define RTEST(v) (((VALUE)(v) & ~Qnil) != 0)
#define NIL_P(v) ((VALUE)(v) == Qnil)

という感じで宣言されてて、実際に irb なんかで

irb(main):001:0> false.object_id
=> 0
irb(main):002:0>

ってなるんですが、object_id と上記宣言の値が合致する根拠は不明 (こら
# 何書いてるんだか ...

あるいは、false.| の定義は以下のようになってて

static VALUE
false_or(obj, obj2)
   VALUE obj, obj2;
{
   return RTEST(obj2)?Qtrue:Qfalse;
}

上記の ruby.h の抜粋によれば RTEST というマクロは v が Qfalse 又は Qnil だったらば偽 (値としては 0) になり、それ意外の場合は真 (値としては 1? それとも 0 以外?) となる。ので、false_or においては obj2 が Qfalse 又は Qnil だったらば Qfalse を返却し、それ以外ならば Qtrue を返却する、という事になる。

あるいは、現リファレンスマニュアルにある 演算子式の定義 という部分に「再定義可能な演算子」という項目があって、例えば FalseClass におけるインスタンスメソッドはこうした論理演算子を定義しているのかな??という事も分かった。
ただ、以下のような条件式が

(x == 1)

最終的に false 又は true というオブジェクトに変換されてしまうのかどうかは不明。ただし、irb において

irb(main):002:0> (1 == 1) & false
=> false
irb(main):003:0>

というカンジで評価してくれているので上記の類推は当たらずとも遠からず、かと。

とりあえず、エントリ入れたら無駄口をタタかず、ファイルを co して修正してみます。

さらに追記

む。書き終わったらチェックしなきゃいけないんだな。

チェックなツールがある模様。bitclust ディレクトリ配下にファイルあり

  • bc-tohtml は bitclust/tools 配下
  • bc-rdoc も bitclust/tools 配下

ReFe は入れとく必要があるんだろうか。