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


    主站蜘蛛池模板: 国产亚洲人成无码网在线观看| 亚洲精品国产电影| 天堂在线免费观看中文版| 免费a级毛片永久免费| 亚洲AV无码不卡无码| 中文字幕乱码亚洲无线三区| 国产精品色拉拉免费看| 亚洲一级毛片在线观| 欧美最猛性xxxxx免费| 久久亚洲精品成人| 亚洲Aⅴ在线无码播放毛片一线天| 麻豆最新国产剧情AV原创免费| 亚洲午夜精品国产电影在线观看| 久久国内免费视频| 亚洲精品自偷自拍无码| 四虎国产精品免费久久影院| 亚洲欧洲精品久久| 免费国产成人高清在线观看网站 | 97视频热人人精品免费| 亚洲综合色在线观看亚洲| 一级片在线免费看| 亚洲av日韩av天堂影片精品| 欧洲乱码伦视频免费| 亚洲AV无码一区二区三区性色 | 国产产在线精品亚洲AAVV| 99久久久国产精品免费无卡顿| 亚洲日日做天天做日日谢| 免费人成网站在线播放| 日韩精品无码免费专区午夜| 亚洲综合激情九月婷婷| 免费看美女被靠到爽的视频| 亚洲国产精品免费在线观看| 男女交性永久免费视频播放| 中国国语毛片免费观看视频| 国内自产少妇自拍区免费| av午夜福利一片免费看久久| 免费永久看黄在线观看app| a级毛片黄免费a级毛片| 久久亚洲国产精品123区| 最近2019中文字幕免费直播 | 久久精品国产亚洲av麻豆蜜芽|