<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免费视频观看网站| 久久国产成人精品国产成人亚洲| 91禁漫免费进入| 中文字幕无线码中文字幕免费| 亚洲色大成网站www永久男同| 国产亚洲精午夜久久久久久| 真实乱视频国产免费观看| **一级毛片免费完整视| 国产免费网站看v片在线| 免费精品视频在线| 亚洲精品永久在线观看| 亚洲中文无码av永久| 亚洲视频在线免费观看| 亚洲精品无码不卡在线播放HE| 成人国产mv免费视频| 日韩精品成人无码专区免费| 免费国产黄网站在线观看视频 | 成人免费视频69| 免费黄色电影在线观看| 国产区在线免费观看| 日产久久强奸免费的看| 在线91精品亚洲网站精品成人| 国产亚洲精品成人AA片| 激情综合亚洲色婷婷五月| 亚洲视频免费播放| 亚洲视频一区在线| 老司机亚洲精品影院| 色婷婷六月亚洲婷婷丁香| 亚洲欧洲日韩国产综合在线二区| 亚洲人成网站在线观看播放| 亚洲综合网站色欲色欲| 国产亚洲精品福利在线无卡一| 亚洲午夜爱爱香蕉片| 国产亚洲?V无码?V男人的天堂| 亚洲精品在线视频| 久久精品国产亚洲7777| 亚洲最大AV网站在线观看| 亚洲AV永久无码精品| 亚洲国产精品婷婷久久| 亚洲综合网美国十次|