天天看點

Ruby 1.9概要(2)Kernel和Object

二、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

o = struct.new(:a,:b).new(1,2)

magic(o)

puts o.foo{|myself,x,y| puts myself.inspect;x + y }

更多例子:

o = 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

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?方法:

a = "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 = ""

a.define_singleton_method(:foo){|x| x + 1}

a.send(:foo,2)  =>3

a.foo(2)  => 3

8、kernel#singleton_methods, kernel#methods,傳回的是将是方法名symbol組成的數組,過去是方法名的字元串數組。

文章轉自莊周夢蝶  ,原文釋出時間 2008-10-01