JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Languages on JVM » JRuby  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 深入探討 Object Reflection
cpi





發文: 12
積分: 0
於 2006-03-16 11:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
出自 http://anw.stikipad.com/ocean/show/Object+and+Reflection

* 來看看 ruby 如何深入探討 object 的相關功能, “o” 表示某個 object instance

. o.class 找到 object 的 class
. o.methods 可以找到 methods
. o.respond_to? 測試某個 method 是否存在
. o.object_id 它是 object 的唯一 id
. o.inspect 可以 dump object 內容

. o.is_a?, o.kind_of?
當物件的 class 是某個 class 或是某個父字輩 class 或某個 mix-in 模組?

. o.instance_of?
當物件的 class 是某個 class?
ps. 這個好像跟 java 不一樣!

. 若你還有進一步需要, 這裡有更多 methods 可以幫你, 這些是將 “Module” mix-in 進去, 可不會在 Object 上找到!
+ private_instance_methods
+ protected_instance_methods
+ public_instance_methods
+ private_class_methods
+ protected_class_methods
+ public_class_methods
+ singleton_methods
+ class_variables
+ ...
1
2
3
4
5
6
7
no = 100
puts no.class                    #Fixnum
puts no.class.superclass      #Integer
 
puts no.is_a? Integer               #true
puts no.kind_of? Integer          #true
puts no.instance_of? Integer    #false, it's Fixnum


* 呼叫 method, 所有的 methods, 在 ruby 都可以用 send 呼叫
1
2
      "John Coltrane".send(:length)
      "Miles Davis".send("sub", /iles/, '.')


* Proxy 例子
1
2
3
4
5
6
7
8
9
10
11
12
13
            class Proxy
              def initialize(object)
                @object = object
              end
 
              def method_missing(symbol, *args)
                @object.send(symbol, *args)
              end
            end
 
            data = ["a", "b", "c"]
            proxy = Proxy.new(data)
            puts proxy.first # Outputs: "a" 


* class 的繼承關係? 可以利用 Class#superclass 找到父親. 但 ruby 還可以利用 mix-in 功能將別的模組的變數及 methods 加進去. 這時後你可以用 Module#ancestors 找到父親及 mix-in 模組.
1
2
3
4
5
6
7
      a = 123
      klass = a.class
      while klass do
        print klass
        klass = klass.superclass
        print " < " if  klass
      end


* 因為 class 也是 constant, 所以你可以用 Module#constants 找到所有的 class
1
2
3
      Module.constants.each { |x|
        puts x
      }


* 查看所有活著的物件, 要用 ObjectSpace.each_object
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      class Book
        attr_accessor :title
      end
 
      class Magzine < Book
      end
 
      b1 = Book.new
      b1.title ="A" 
      b2 = Book.new
      b2.title ="B" 
      m1 = Magzine.new
      m1.title ="C" 
 
      ObjectSpace.each_object(Book) { |x|
        puts x.inspect
      }


cpi edited on 2006-03-16 16:35
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
2063 深入探討 Object Reflection cpi 2606 2006-03-16 11:45
» JWorld@TW »  Languages on JVM » JRuby

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8