Tuesday, September 30, 2008

zshrc変更の反映

$ source .zshrc

Monday, September 29, 2008

Ruby1.9 install

結局プログラムの名前を変えるとうまくインストールできないようだ
なんかわからずに/usr/local/bin/にrubyでインストールされた

一応_ruby, _irb, _gemなどのエイリアスを貼って対処する
TextMateは相変わらずだめだ

Ruby1.9 install again

download

$ svn co http://svn.ruby-lang.org/repos/ruby/trunk ruby
install
$ autoconf
$ ./configure --program-suffix=_
$ make
$ sudo make install

RubyのClassクラスはすべてのクラスの母であり、Moduleクラスはすべてのクラスの父である

class Module
  def m
    'm'
  end
end

Module.new.m # => "m"
Enumerable.m # => "m"
Math.m # => "m"

Kernel.m # => "m"

Class.new.m # => "m"

Object.m # => "m"
Array.m # => "m"
class MyClass
end
MyClass.m # => "m"

Module.m # => "m"

Class.m # => "m"
Moduleクラスはモジュールの生成クラスである
だからModuleクラスにinstanceメソッドmを定義すると
すべてのモジュールで定義されたモジュールメソッドself.mになる

KernelモジュールもModuleクラスで生成されるから
当然そのモジュールメソッドself.mになる

一方ModuleクラスはClassクラスのスーパークラスである
だからModuleクラスに定義されたinstanceメソッドmは
Classクラスで定義されたinstanceメソッドmになる

Classクラスはすべてのクラスの生成クラスだから
Classクラスのinstanceメソッドmは
すべてのクラスのクラスメソッドself.mになる

その中にはModuleクラスも含まれるから
Moduleクラスのクラスメソッドself.mにもなる

ここでModuleクラスはClassクラスのスーパークラスだから
Moduleクラスのクラスメソッドself.mは
Classクラスのクラスメソッドself.mになる

こうしてModuleクラスに定義されたinstanceメソッドmは
すべてのクラスにおけるクラスメソッドself.mになる

ここでKernelモジュールはObjectクラスにincludeされているので
そこに定義されたinstanceメソッドはObjectクラスに定義されたメソッドとなる
Objectクラスはすべてのクラスのスーパークラスだから
結果Kernelモジュールに定義されたinstanceメソッドは
すべてのクラスに定義されたinstanceメソッドとなる

ところがModuleクラスからKernelモジュールに渡された先のメソッドmは
Kernelモジュールにおいてモジュールメソッドself.mになるから
Objectクラスには渡されない

Objectクラス(およびKernelモジュール)に定義されたinstanceメソッドoは
すべてのクラスのクラスメソッド(モジュールメソッドを含む)となると共に
すべてのクラスのinstanceメソッドとなる
これはクラスから生成されるすべてのオブジェクトで
instanceメソッドoが使えることを意味している

一方でModuleクラスに定義されたinstanceメソッドmは
すべてのクラスのクラスメソッド(モジュールメソッドを含む)となるが
それらのinstanceメソッドになることはない

これらのことから
すべてのオブジェクトの挙動に影響を与えたいときは
Objectクラスにinstanceメソッドを定義すれば良く
すべてのクラスの挙動に影響を与えたいときは
Moduleクラスにinstanceメソッドを定義すればいい


MUJI Desk

無印の机のコスト計算をメモっておこ

サイズ:w122 * d52.5

(定価)
legs        tamo      melamine
stainless    63,000    58,800
steel        44,100    39,900

(10%OFF)
legs        tamo      melamine
stainless    56,700    52,920
steel        39,690    35,910

タモ材天板にステンレス脚で10%引きで56,700円
次の候補はタモ材にスチール脚で39,690円
差額は17,010円
一番安いのはメラミン天板とスチール脚で35,910円
差額は20,790円

メラミンが好きでないのと差額がタモ材とで3,000円しかないので
一番安いのは選択肢としてはない
タモ材スチール脚のとの差額は思ったほどじゃないな
10%OFFは3日から14日まで

Ruby method listのリファクタリング

Rubyのメソッドリストをリファクタリングした
出力される内容に大きな変更はないけど
1つのファイルであったものを
1つの汎用的なファイルと1つの専用ファイルに分けた
思いの外時間が掛かったな

Saturday, September 27, 2008

RubyのObjectクラスはタイムマシーンだ!

Objectクラスはすべてのクラスのスーパークラスである
だからObjectクラスに定義されたinstanceメソッドoは
すべてのクラスで定義されたinstanceメソッドoになる

ClassクラスもObjectクラスのサブクラスだから
当然instanceメソッドoはClassクラスのinstanceメソッドoになる

一方Classクラスはすべてのクラスの生成クラスである
だからClassクラスのinstanceメソッドとなったoは
すべてのクラスのクラスメソッドself.oになる

この中には当然Objectクラスが含まれているから
Classクラスのinstanceメソッドoは
Objectクラスのクラスメソッドself.oにもなる

ところがObjectクラスはClassクラスのスーパークラスだから
Objectクラスのクラスメソッドになったself.oは
Classクラスのクラスメソッドself.oにもなる

整理しよう
Objectクラスが1つのinstanceメソッドoを持つと
それがClassクラスを含むすべてのクラスのinstanceメソッドoとなり
ClassクラスのinstanceメソッドoがObjectを含むすべてのクラスのクラスメソッドself.oとなり
Objectクラスのクラスメソッドself.oがClassクラスのクラスメソッドself.oとなる
こうしてRuby空間に存在するすべてのクラスには
instanceメソッドoとクラスメソッドself.oが生まれることとなる

ClassクラスはObjectクラスを含むすべてのクラスの母である
従ってすべてのクラスはClassクラスの特性に依存する
一方でClassクラスはその子であるObjectクラスの弟子である
従ってClassクラスはObjectクラスの特性を受け継ぐ

このような多層的循環構造によって
Objectクラスが変わると
Classクラスが変わり
その変化はすべてのクラスを変える
つまりObjectクラスへのオペレーションは
過去の事実(Classクラス)を再定義し
延いては今の世界(すべてのクラス)を再定義する!

そうRubyのObjectクラスは…

時空を超えるタイムマシーンなんだ!

Friday, September 26, 2008

Rubyのクラス-オブジェクトはやっぱり複雑だ

だのでもう一度整理
  • クラスにはメソッドを定義することができる。
  • メソッドには、自身のためのselfメソッドとインスタンスのためのInstanceメソッドがある。
  • クラスはインスタンスを生成でき、そのインスタンスはそのクラスに定義されたInstanceメソッドを自身のためのメソッドとして使える。
  • オブジェクトにおけるselfメソッドはInstanceメソッドであり、クラスにおけるselfメソッドはクラスメソッドである。
  • クラス継承は、サブクラスにおいてスーパークラスに定義されたselfメソッドとInstanceメソッドを、自分に定義されたメソッドとして継承すること。
  • すべてのクラスの子孫クラスはObjectクラスであり、従ってObjectクラスに定義されたselfメソッドとInstanceメソッドは、そのまますべてのサブクラスで定義されたものになる。
  • すべてのクラスはClassクラスのインスタンスだから、Classクラスに定義されているInstanceメソッドはすべてのクラスのクラスメソッドになる。
  • ClassクラスはObjectクラスとModuleクラスを継承しているから、それらに定義されているselfメソッドとInstanceメソッドは、Classクラスに定義されたものになる。従って、ObjectクラスとModuleクラスに定義されているInstanceメソッドは、すべてのクラスのクラスメソッドになる。
  • すべてのモジュールは、Moduleクラスのインスタンスである。よってModuleクラスに定義されているInstanceメソッドは、すべてのモジュールのモジュールメソッドになる。
  • モジュールのincludeは、そこに定義されたInstanceメソッドを、include先クラスのInstanceメソッドとして継承すること。この場合モジュールに定義されたselfメソッド(モジュールメソッド)は継承されない。
  • ObjectクラスはKernelモジュールをincludeしている。従って、Kernelモジュールに定義されたInstanceメソッドは、Objectクラスに定義されたものになる。

Thursday, September 25, 2008

RSpecをちゃんとやらんと!

RubyClassListの作成で
機能を追加するたびに
他の箇所からバグがでる
これじゃ大規模な開発では
バグ修正ばかりに時間がとられるというのがよくわかる
バグの大半はプログラマのケアレスミスだ

これを防ぐにはやっぱりRSpecのようなBDD開発が必須なんだろう
よし今からちゃんとマスターするぞ!

Wednesday, September 24, 2008

さちAppStoreで2000万に激しく反応す!

さっきiPhone用のゲームを作ってAppStoreで$5で売ったら
2ヶ月で2000万儲かったアメリカ人の話をさちにしたら
プログラミングの話にはいつも小さい反応しか示さないのに
激しく反応してたのでおかしくなった
Webなんていいからとっととそっちやれよって感じで
まあたしかに2ヶ月で2000万はすごいな

残念なことにiPhoneおよびiPodTouch用のアプリは
現状Rubyでは書けずObjective-Cという言語を学ぶ必要がある
まあ言語は時間かければなんとかなるが
問題はアイディアだな

で少し考えたら
  • 画面に数字をランダムに表示してその数だけタップするゲーム
というのが出てきた

はやくiPodTouchこないかなあ

RubyClassListをネットにアップ

Plalaのフリーチケットで自分のWebページが作れるということがわかったので
早速RubyClassList用に作った


簡単なCGIには対応してるようなので
ちょっと遊ぶにはいいかも

Ruby 1.9.0 updated

Rubyを8月26日のリビジョンに変更した
そしたらTextmateから実行が効かなくなってしまったよ
今月もリビジョンされるがそれでなおるかな?

Webサービスのアイディア

そろそろWebサーバーを立ち上げたい
自前は別途サーバーを買わなきゃなりそうなので
現実的にはレンタルか

何かいいWebサービスのアイディアがないか考えていたら
思いついたのでメモっておく

  • ランチ写真の投稿サイト
  • 自分のおすすめ品投稿サイト
2つ目のは特に気に入っている
やあ考えれば出てくるもんだな
俺は天才か

Monday, September 22, 2008

Ruby 1.9.0 2008-08-26 revision 18849 installed

何回かトライして断念していたけど
今度はインストールできた
対策は

$ ./configure --prefix=/usr/local --with-readline-dir=/usr/local

ただwith-readline..は無視されたようだけど…

Sunday, September 21, 2008

Barbar Sati

Barbar Satiに行った
気持ちよくなって寝てしまった
所要時間40分
最初の頃は2時間くらい掛かっていたけど
ここのところは大体このくらいで終わる

前回は8月7日ということで今回も1月半ぶりだった

Thanks!

MacPortでRubyのヴァージョンを使い分ける

> port installed ruby
> sudo port deactivate ruby @1.8.7-p72_0....
> sudo port activate ruby @1.8.6-p111....

バージョンを全部ちゃんと指定しないといけない

Friday, September 19, 2008

Ruby Class List

一応完成とするか
変更点は
  • クラス階層を表示するようにした
  • 1.8.7以降で導入されたメソッドのリンクカラーを変えた(186のメソッドリストを読み込んで)
  • 全体に表示を詰めた
  • !や?で終わるメソッドのリンクにも対応させた
この作成の過程でRuby186のメソッドリストを保存するのにPStoreを使ってみた
なるほどこれを使えばRubyオブジェクトがそのまま保存できるんだ
簡単で便利だ

iPod Touchが来たらPDF化してそこで見れるようにしよう

Ruby Ref Manual keywords

&:=26
*:=2a
+:=2b
-:=2d
/:=2f
%:=25
^:=5e
~:=7e
+@:=2b=40
<<:=3c=3c
<=>:=3c=3d=3e
==:=3d=3d
[]:=5d=5d
collect!, map!:collect=21
empty?:empty=3f

Wednesday, September 17, 2008

Webの一部を印刷またはPDF化

うまい方法が見つからないなあ

Tuesday, September 16, 2008

WebページをPDFに

iPod Touchも来るので
WebページをPDFファイルにするツールを探す
なかなかよいのが見つからない

っとふいに
ページプリントでPDF出力できることを思い出す
ページのマージツールはAutomatorで作成できた(/dev/Apple/pdf_merge)
灯台下暗し!

RHGを早々にPDF化

Automator を使って PDF をマージする - GameSprit
http://blog.goo.ne.jp/vallie/e/6a834a4d70c2e9dd524d9a681abc160e

iPod Touchを購入!

臨時収入、new iPod Touch発表、1万円の値下げ
と条件が揃ってもう我慢なりましぇん
久しぶりの大物買いをしました

音楽、ビデオ再生、ネット接続はもとより
PDFビューワとしてどの程度使い物になるか
出荷は1〜3週間後ということで待ち遠しいなあ

Monday, September 15, 2008

Rubyクラス一覧ジェネレータ

今度はうまくできたよ!クラスのオーダリング

Class_tree

クラスの一覧をクラス階層に従ってソートしたいんだけど
もう一歩のところでやり方が分からない
いい線行ってると思うんだけれどだめだ


   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  def get_klasses(obj)

   4    klasses = obj.constants.sort.map{ |c| eval(c.to_s) }.select{ |c| c.class.to_s =~ /^(Class|Module)$/ }

   5    normal_class, module_class, error_class, erb_class = [],[],[],[]

   6    klasses.each do |klass|

   7      case

   8      when klass.to_s =~/ERB|StringScanner/

   9        erb_class << klass

  10      when klass.to_s =~ /Error/

  11        error_class << klass

  12      when klass.class == Module

  13        module_class << klass

  14      else

  15        normal_class << klass

  16      end

  17    end

  18    return normal_class, module_class, error_class

  19  end

  20  

  21  def get_methods(klass)

  22    result = []

  23    meths = %w(public_methods protected_methods private_methods public_instance_methods protected_instance_methods private_instance_methods)

  24    begin

  25      meths.each do |m|

  26        meth = klass.send(m,false)

  27        meth.delete_if { |m| m =~ /get_klasses|get_methods|get_supers/ } if klass == Object

  28        result << {m => meth.sort} unless meth.empty?

  29      end

  30    rescue Exception => e

  31  

  32    end

  33    result

  34  end

  35  

  36  def get_supers(klass)

  37    (klass.superclass ? get_supers(klass.superclass) : []).unshift(klass)

  38  end

  39  

  40  klasses, modules, errors = get_klasses(Object)

  41  all_klasses = klasses + modules + errors

  42  

  43  klasses = (klasses).sort_by { |k| k.superclass.to_s }

  44  

  45  class Array

  46    def class_tree(parents)

  47      result = []

  48      parents.each do |parent|

  49        s_class = select{ |this| this.superclass == parent }

  50        result << class_tree(s_class) << s_class

  51      end

  52      result

  53    end

  54  end

  55  

  56  klasses = [Object, Integer, File, Numeric, IO, String]

  57  p klasses.class_tree([BasicObject])

Saturday, September 13, 2008

Rubyクラス一覧ジェネレータ

Rubyのクラス一覧ジェネレータが一応完成
Gistにポストしたのでここにも貼る
Gistのembedをコピペするだけでいい
すごいなGist

Friday, September 12, 2008

Gistの使い方

  1. 自分のアカウントでコードをペーストする
  2. Terminalでdropbox/github/に移動
  3. Gistの対象コードのprivate cloneからコードをpullする(git clone git@gist.github.com:10357.git git-10357)
  4. pullしたコードを修正する
  5. 修正をコミットする(git commit -a)
  6. サーバにpushする(git push)

Html Generator for Ruby 1.9 Classes

Ruby1.9のクラスリストを表示するHTMLファイルを生成するスクリプトを作った


   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  require "erb"

   4  

   5  def get_klasses(obj)

   6    klasses = obj.constants.sort.map{ |c| eval(c.to_s) }.select{ |c| c.class.to_s =~ /^(Class|Module)$/ }

   7    normal_class, module_class, error_class = [],[],[]

   8    klasses.each do |klass|

   9      case

  10      when klass.to_s =~ /Error/

  11        error_class << klass

  12      when klass.class == Module

  13        module_class << klass

  14      else

  15        normal_class << klass

  16      end

  17    end  

  18    return normal_class, module_class, error_class

  19  end

  20  

  21  def get_methods(klass)

  22    result = []

  23    meths = %w(public_methods protected_methods private_methods

  24               public_instance_methods protected_instance_methods

  25               private_instance_methods singleton_methods)

  26    begin

  27      meths.each do |m|

  28        meth = klass.send(m,false)

  29        result << {m => meth.sort} unless meth.empty?

  30      end

  31    rescue Exception => e

  32      

  33    end

  34    result

  35  end

  36  

  37  klasses, modules, errors = get_klasses(Object)

  38  all_klasses = klasses + modules + errors

  39  

  40  file_name = "/Users/keyes/Desktop/ruby_class.html"

  41  File.open(file_name, "w+") do |f|

  42    f.puts ERB.new(DATA.read).result(binding)

  43  end

  44  

  45  __END__

  46  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

  47    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  48  <html>

  49  <head>

  50  <meta http-equiv="Content-type" content="text/html; charset=utf-8">

  51  <title>Ruby 1.9 Class List</title>

  52  <style type="text/css" media="screen">

  53    h1 {color:#eed; background:#149; padding-left:10px;}

  54    h3 {color:#833;}

  55    p.list {padding-left:15px;}

  56    div#meths {padding-left:15px;}

  57    span#top_link {font-size:18px; float:right; margin:8px 20px;}

  58    a:link {color:;}

  59  </style>

  60  </head>

  61  <body id="main" style='background:#eed'>

  62    <p class='list'>

  63      <% klasses.each do |klass| %>

  64      <span><a href="#<%= klass %>"><%= klass %></a></span>

  65      <% end %>

  66    </p>

  67    <p class='list'>

  68      <% modules.each do |mod| %>

  69      <span><a href="#<%= mod %>"><%= mod %></a></span>

  70      <% end %>

  71    </p>

  72    <p class='list'>

  73      <% errors.each do |error| %>

  74      <span><a href="#<%= error %>"><%= error %></a></span>

  75      <% end %>

  76    </p>

  77  <% all_klasses.each do |klass|  %>

  78    <h1 id="<%= klass %>"><%= klass %>:<%= klass.class %><span id="top_link"><a href=<%= File.basename(file_name) %> style="color:#883">top</a></span></h1>

  79    <div id='meths'>

  80  <% meths = get_methods(klass) %>

  81  <% meths.each do |method| %>

  82    <% method.each do |title, meths| %>

  83      <h3><%= title %></h3>

  84      <% meths.each do |meth| %>

  85      <span><a href="http://www.ruby-lang.org/ja/man/html/<%= klass %>.html#<%= meth %>"><%= meth  %></a> </span>

  86      <% end %>

  87    <% end %>

  88  <% end %>

  89  </div>

  90  <% end %>

  91  </body>

  92  </html>

Thursday, September 11, 2008

make dot file for ruby classes


   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  ruby_classes = [ BasicObject, Object, Kernel, Module, Class, String, Array, Hash, Numeric, Integer, Fixnum, Float, Bignum, Range,

   4  Regexp]#, MatchData, Struct, Struct::Tms, Symbol, IO, File, File::Stat, Dir, Time, Proc, Method, UnboundMethod, Binding, Encoding, Exception, Thread, ThreadGroup, Fiber, Mutex, Process::Status, TrueClass, FalseClass, NilClass ]

   5  #Enumerator, Complex, Rational,

   6  #ruby_modules = %w(Comparable Enumerable Errno FileTest GC Marshal Math ObjectSpace Process Process::GID Process::Sys Process::UID Signal)

   7  

   8  class_output = ""

   9  mod_output = ""

  10  

  11  ruby_classes.each do |klass|

  12    begin

  13      superklass = klass.superclass

  14      mods = klass.included_modules.delete_if{ |m| m == Kernel unless klass == Object }

  15      meths = klass.instance_methods(false).join(",").gsub(/(([\w?!=\+\-\>@]+\,){3})/,'\1\n').gsub(/[<>|]/){ |m| '\\' +}

  16  

  17      class_output << %Q{  #{klass} [label="#{klass}\\nclass|#{meths}"]\n} << %Q{  #{superklass} -> #{klass}\n}

  18      

  19      mods.each do |m|

  20        mod_output << %Q{  #{m} -> #{klass}[color=red]\n}

  21      end

  22    rescue Exception => e

  23    end

  24  end

  25  class_output.gsub!(/\s(\w+)::(\w+)/,'\1\2')

  26  mod_output.gsub!(/\s(\w+)::(\w+)/,'\1\2')

  27  

  28  File.open("/Users/keyes/Desktop/ruby_class.dot", "w+") do |f|

  29    f.puts <<-"DOT"

  30    digraph RubyClass {

  31      rankdir=TB

  32      node[shape=Mrecord, height=1.2, width=2, style=bold]

  33      #{class_output}

  34      node[shape=record, style=filled]

  35      #{mod_output}

  36    }

  37    DOT

  38  end

Friday, September 05, 2008

RubyのTopLevelは両生類だ!

  • そこで定義されたメソッドはObjectのprivateメソッドになる。だからObjectクラス
  • publicにすることもできる
  • Singletonメソッドを定義できる。だからmainインスタンス

   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  module Kernel

   4    def ker_pub_hello

   5      "hello of Kernel Public called from #{self}"

   6    end

   7    private

   8    def ker_pri_hello

   9      "hello of Kernel Private called from #{self}"

  10    end

  11  end

  12  

  13  class Object

  14    def obj_hello

  15      "hello of Object called from #{self}"

  16    end

  17  end

  18  

  19  def top_hello

  20    "hello of Top called from #{self}"

  21  end

  22  class << self

  23    def top_singleton_class_hello

  24      "hello of Top Singleton Class from #{self}"

  25    end

  26  end

  27  def self.top_singleton_hello

  28    "hello of Top Singleton from #{self}"

  29  end

  30  public

  31  def sel

  32    self.select{ |m| m =~ /hello$/  }

  33  end

  34  

  35  

  36  main = Object.new

  37  main.obj_hello # => "hello of Object called from #<Object:0x11a30>"

  38  

  39  ker_pub_hello       # => "hello of Kernel Public called from main"

  40  ker_pri_hello       # => "hello of Kernel Private called from main"

  41  self.ker_pub_hello  # => "hello of Kernel Public called from main"

  42  obj_hello           # => "hello of Object called from main"

  43  top_hello           # => "hello of Top called from main"

  44  self.top_singleton_class_hello # => "hello of Top Singleton Class from main"

  45  self.top_singleton_hello # => "hello of Top Singleton from main"

  46  

  47  self # => main

  48  self.class # => Object

  49  self.methods(true).sel # => ["top_singleton_class_hello", "ker_pub_hello", "top_singleton_hello", "obj_hello"]

  50  self.private_methods(false).sel # => ["top_hello"]

  51  self.singleton_methods(false) # => ["public", "to_s", "include", "top_singleton_hello", "private", "top_singleton_class_hello"]

  52  

  53  Object.private_instance_methods(false).sel # => ["top_hello"]

  54  Object.included_modules # => [Kernel]

  55  Kernel.private_instance_methods.sel # => ["ker_pri_hello"]

  56  Kernel.instance_methods.sel # => ["ker_pub_hello"]

  57  

  58  class H

  59    top_hello # => "hello of Top called from H"

  60    def k

  61      top_hello

  62    end

  63  end

  64  H.new.k # => "hello of Top called from #<H:0xe6a0>"

Thursday, September 04, 2008

Mighty Mouse電池交換

前回は7月13日
またAskul*2で

Ruby methods


   1  #!/usr/local/bin/ruby

   2  # encoding: utf-8

   3  class Demo

   4    def self.class_method

   5    end

   6    def public_method

   7    end

   8    private

   9    def private_method

  10    end

  11    protected

  12    def protected_method

  13    end

  14    class << self

  15      def class_singleton_method

  16      end

  17    end

  18  end

  19  

  20  

  21  m1 = Demo.methods.select{ |m| m =~ /methods/ } # => ["public_methods", "methods", "instance_methods", "singleton_methods", "public_instance_methods", "protected_methods", "protected_instance_methods", "private_methods", "private_instance_methods"]

  22  

  23  demo = Demo.new

  24  m2 = demo.methods.select{ |m| m =~ /methods/ } # => ["public_methods", "methods", "singleton_methods", "protected_methods", "private_methods"]

  25  

  26  puts "<Methods for Demo class>"

  27  m1.map { |m| [m, Demo.send(m,false)] }.each { |k,v| puts "#{k} -> #{v}" }

  28  puts "\n<Methods for demo object>"

  29  m2.map { |m| [m, demo.send(m,false)] }.each { |k,v| puts "#{k} -> #{v}" }


OUTPUT:

<Methods for Demo class>
instance_methods -> [:public_method, :protected_method]
public_instance_methods -> [:public_method]
protected_instance_methods -> [:protected_method]
private_instance_methods -> [:private_method]
methods -> [:class_method, :class_singleton_method]
singleton_methods -> [:class_method, :class_singleton_method]
protected_methods -> []
private_methods -> [:inherited, :initialize, :initialize_copy]
public_methods -> [:class_method, :class_singleton_method, :allocate, :new, :superclass]

<Methods for demo object>
methods -> []
singleton_methods -> []
protected_methods -> [:protected_method]
private_methods -> [:private_method]
public_methods -> [:public_method]

以上より以下のことが分かった
  • methods:自分が使えるメソッドを返す。falseの場合selfメソッド(Singletonメソッド)のみを返す(singletonメソッドと同じ)
  • singleton_methods:そのSingletonメソッドを返す
  • public_methods, protected_methods:自分が使えるメソッドを返す。つまりそのオブジェクトのクラスに定義されているpublic_instance_methodsおよびprotected_instance_methodsを返す。クラスにおいてmethods=public_methods+protected_methodsである。falseの場合はそのクラスへの継承メソッドは含まない。
  • private_methods:そのオブジェクトのクラスに定義されているprivate_instance_methodsを返す
  • instance_methods, public_instance_methods, protected_instance_methods, private_instance_methods:クラスオブジェクト(もジュールを含む)だけが使えるメソッドで、そのクラスに定義されているinstanceメソッドを返す。falseの場合はそのクラスへの継承メソッドは含まない