莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Ruby 1.9概要(2)Kernel和Object

          Posted on 2008-10-01 13:48 dennis 閱讀(601) 評論(0)  編輯  收藏 所屬分類: 動態語言
          二、Kernel 和 Object
          1、引入了BasicObject對象,作為一個頂級的空白狀態對象:
          BasicObject.instance_methods # => [:==,:equal?,:"!",:"!=",:__send__]
          Object.ancestors       # => [Object, Kernel, BasicObject]

          引入這個對象對于Ruby對象體系帶來的影響我還不清楚。
          2、instance_exec方法,允許傳遞參數、self到一個block并執行之,也就是說為特定的instance執行block。
          def magic(obj)
             
          def obj.foo(&block)
               instance_exec(self, a, b, 
          &block)
             end
          end
          = Struct.new(:a,:b).new(1,2)
          magic(o)
          puts o.foo{
          |myself,x,y| puts myself.inspect;x + y }

          更多例子:
          = Struct.new(:val).new(1)
          o.instance_exec(
          1){|arg| val + arg }  =>2


          在Ruby 1.8中實現這個方法:
          class Object
            module InstanceExecHelper; end
            include InstanceExecHelper
            
          def instance_exec(*args, &block) # !> method redefined; discarding old instance_exec
              mname = "__instance_exec_#{Thread.current.object_id.abs}_#{object_id.abs}"
              InstanceExecHelper.module_eval{ define_method(mname, 
          &block) }
              begin
                ret 
          = send(mname, *args)
              ensure
                InstanceExecHelper.module_eval{ undef_method(mname) } rescue nil
              end
              ret
            end
          end

          3、Kernel的require方法載入的文件將以完整路徑存儲在變量$"中,等價于:
          $" << File.expand_path(loaded_file)

          通過在irb中觀察$"變量即可看出差別。

          4、Object#tap方法,將對象傳入block并返回自身,用于鏈式調用:
          "hello".tap{|a| a.reverse!}[0] #=> "o"
          "F".tap{|x| x.upcase!}[0]  #=> "F" (注意到"F".upcase!返回的是nil)

          5、Kernel#instance_variable_defined?方法:
          = "foo"
          a.instance_variable_defined? :@a                  
          # => false
          a.instance_variable_set(:@a, 1)
          a.instance_variable_defined? :@a                  
          # => true

          6、Object#=~

          匹配失敗的時候返回nil而不是false
          1 =~ 1 # => nil

          7、Kernel#define_singleton_method 方法,
          = ""
          a.define_singleton_method(:foo){
          |x| x + 1}
          a.send(:foo,
          2)  =>3
          a.foo(
          2)  => 3

          8、Kernel#singleton_methods, Kernel#methods,返回的是將是方法名symbol組成的數組,過去是方法名的字符串數組。


          主站蜘蛛池模板: 景谷| 光山县| 怀化市| 阿拉善右旗| 贵阳市| 枣阳市| 徐水县| 闽侯县| 卢氏县| 浦北县| 保亭| 大兴区| 吉林省| 平顶山市| 桂平市| 泾阳县| 昭平县| 衡阳县| 如东县| 安泽县| 雷山县| 咸宁市| 望都县| 台江县| 石城县| 五大连池市| 彰武县| 古交市| 平昌县| 龙口市| 得荣县| 宁波市| 大足县| 天峻县| 樟树市| 上林县| 古蔺县| 都匀市| 晋宁县| 淮北市| 建德市|