<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

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

    Ruby 1.9概要(2)Kernel和Object

    Posted on 2008-10-01 13:48 dennis 閱讀(597) 評論(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組成的數組,過去是方法名的字符串數組。


    主站蜘蛛池模板: 久久大香伊焦在人线免费 | 免费一级毛片在线播放不收费| 亚洲永久中文字幕在线| 香蕉免费一区二区三区| 亚洲AV无码第一区二区三区| 一区二区三区无码视频免费福利| 国产精品亚洲片在线| 在线观看特色大片免费网站| 亚洲AV无码乱码在线观看裸奔 | 麻豆国产精品免费视频| 亚洲福利视频一区二区三区| 我们的2018在线观看免费高清| 亚洲国产美女精品久久| 成人片黄网站色大片免费| 在线观看国产一区亚洲bd| 亚洲国产婷婷综合在线精品| 一个人看的www在线免费视频| 久久亚洲精品视频| 84pao强力永久免费高清| 亚洲一区中文字幕在线电影网| 成人免费在线视频| 一级黄色毛片免费看| 亚洲Av无码专区国产乱码DVD | 亚洲一级毛片免费看| 国产成人一区二区三区免费视频| 男人免费视频一区二区在线观看| 国产精品亚洲二区在线观看| 日韩免费在线观看视频| 亚洲色一区二区三区四区| 亚洲国产精品无码久久九九 | 精品久久久久久久久亚洲偷窥女厕| 亚洲精品老司机在线观看| 99re免费在线视频| 亚洲丰满熟女一区二区哦| 亚洲人成无码网站| 99在线精品免费视频九九视| 免费人成动漫在线播放r18 | 久久亚洲中文字幕精品一区四| aⅴ免费在线观看| 香蕉视频免费在线播放| 亚洲欧洲在线播放|