Ruby 1.9概要(2)Kernel和Object
二、Kernel 和 Object1、引入了BasicObject對象,作為一個頂級的空白狀態對象:
BasicObject.instance_methods # => [:==,:equal?,:"!",:"!=",:__send__]
Object.ancestors # => [Object, Kernel, BasicObject]
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 }
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
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
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)
"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
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
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
最後更新:2017-05-18 11:01:46
上一篇:
Ruby 1.9概要(3)類和模塊
下一篇:
Ruby 1.9概要(1)新的語法和語義
狀態機的兩種寫法
Android 輕鬆實現語音識別
PostgreSQL是什麼?StackOverflow上開發者最愛和最想要的關係型數據庫
談談分布式事務之一:SOA需要怎樣的事務控製方式
HDU 2281 pell方程
Oracle中的in和exsits的用法
【雲計算的1024種玩法】手把手教你如何編譯升級 OpenResty
初探模板元編程
數據管理DMS發布移動版,隨時隨地管理雲端數據
svnserve:error while loading shared libraries: libaprutil-1.so.0: cannot open shared object file: No such file or directory