<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組成的數組,過去是方法名的字符串數組。


    主站蜘蛛池模板: 日韩在线观看视频免费| 亚洲香蕉久久一区二区三区四区| 色偷偷亚洲第一综合| 成人影片麻豆国产影片免费观看| 精品日韩99亚洲的在线发布| 永久免费在线观看视频| 亚洲国产精品综合福利专区| 毛片高清视频在线看免费观看| 亚洲乱理伦片在线观看中字| 国产在线19禁免费观看国产| 免费一级全黄少妇性色生活片 | 四虎永久在线精品免费网址 | 亚洲二区在线视频| 成年人视频在线观看免费| 亚洲欧美日韩中文字幕一区二区三区 | xxxx日本在线播放免费不卡| 亚洲色偷偷综合亚洲AVYP| 久久99免费视频| 亚洲人成在线中文字幕| 国产一级淫片免费播放电影| 一区二区在线视频免费观看| 亚洲αv在线精品糸列| 精品久久8x国产免费观看| 亚洲精品欧美综合四区| 中文字幕亚洲综合久久男男| 日本免费久久久久久久网站| 亚洲熟妇AV乱码在线观看| 亚洲免费无码在线| 99久久免费观看| 国产成人综合亚洲| 亚洲卡一卡2卡三卡4卡无卡三| 美女被免费喷白浆视频| 成人在线免费视频| 亚洲国产中文在线二区三区免| 国产hs免费高清在线观看| 人妻无码一区二区三区免费| 激情小说亚洲色图| 亚洲欧洲免费视频| 亚洲国产精品自在拍在线播放| 99免费观看视频| 一级做a爰片久久毛片免费看 |