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

时间: 2024-10-07 19:16:18

Ruby 1.9概要(2)Kernel和Object的相关文章

Ruby 1.9概要(3)类和模块

三.类和模块 1.Module#instance_methods, #private_instance_methods, #public_instance_methods Module这三个方法都将返回方法名 的symbol组成的数组,而非过去的字符串数组. 2.Module#const_defined?, #const_get 这两个方法都添加一个参数flag,用来决定是否将它的ancestor中的const包括在查 找链中,例如: module A; X = 1; def foo; end 

浅谈 Ruby 中的 block, proc, lambda, method object 的区别

当大家在百度中搜索"block proc lambda"的时候,会出来很多关于这几个概念之间区别的介绍,既然搜索结果中已经有了这些介绍,那为什么还要写这篇文章? 相信看过百度搜索结果中排名靠前的几篇文章的同学,都会发现其实这些文章并没有很好的说明他们之间区别是什么,大多只是介绍各自的用法,加上些许的区别,即使个别介绍了一些区别,也不够系统,不够深入. 正是基于上述原因,才酝酿了本文.本文以简单示例的方式,详细的介绍了它们之间的区别.相信您阅读完本文,一定会豁然开朗,并在今后的开发中准确

Ruby 1.9概要(1)新的语法和语义

一.新的语法和语义 1.新的Hash定义语法: 例如{a:2}  等价于 {:a=>2} 但是 {"a":2} 出错,并不等价于 {:"a"=>2} 2.试验性质的block内的局部变量 在1.8,block的与外部同名的变量是同一个变量,也就是说block内的变量也可以修改外部的同名变量,这很容易形成难以查找的bug. 例子: # {常规参数;局部变量}d = 2 a = lambda{|;d| d = 1} a.call() d        # =

Ruby 1.9概要(5) 异常

1.异常的相等性,如果两个异常的class.message和backtrace一样,那么认为这两个异常是相等的,可以通过==判断. def method     raise 'foobar' end errors = []2.times do     Thread.new do       begin         method       rescue => e         errors << e       end     end.join end puts errors[-2

Mac OS X下让ruby支持tcl/tk

    我记得在老早在OS X10.8下使用ruby1.9.x的时候只要到下载安装ActiveTcl8.5,没怎么配置就运行tk好好的.但是近日想重新执行下tk代码,发现在require 'tk'的时候就报错鸟!现在用的是ruby2.1.3版本.上网搜了一下,1.9.x之后的版本默认不再将tcl/tk支持编译到ruby里面,so如果你想用则必须重新编译ruby!我勒个去!就不能做成个gem吗?但在多种外围尝试无果的的情况下只有一条路,就是重新编译ruby了...     到ruby官网下载最新的

云栖博客支持语法高亮的常用编程语言

云栖博客支持语法高亮的常用语言 语言名 关键字 Bash bash CoffeeScript coffeescript C++ cpp C# cs CSS css Diff diff HTTP http Ini ini Java java JavaScript javascript JSON json Makefile makefile Markdown markdown Objective-C objectivec Perl perl Python python Ruby ruby SQL s

InnoDB事务结构体代码变量列表

事务结构 struct trx_t 写在前面 InnoDB是MySQL的一个存储引擎,支持事务,支持非堵塞的一致性读,物理存储结构是Page,每个事务都有回滚日志,重做日志,事务还会有死锁检测,各种各样不同的锁等等等等 翻看innodb的源码,发现数下来开启一个事务的时候,InnoDB需要处理63个变量,变量类型纷繁复杂,结构体,自定义的数据类型等等. 这次整理,我翻看了不少同行们写的博客,包括InnoDB官方博客,有一个心得是不同人的翻译不一样,尽管是官方写的博客,也会因为一些篇幅问题,减掉了

Castle~实现IoC容器

IOC的容器确实不少,unity,autofac,Castle 等等,前两种组件如何实现IOC在我之前的文章中已经做过说明了,今天主要来说一下Castle如何去实现IoC,事实上Castle是小微的一个开源项目,最早接触它是在orchard项目中,在orchard里主要用在动态代理方法拦截上,当然这是castle最重要的作用,事实上它当然也可以实现IoC了,不过,你要下载一个Castle.Windsor.dll,它主要实现ioc功能的. 说干就干,事情和前两个组件的工作场景是相似的,一个irep

使用Ruby程序实现web信息抓取的教程_ruby专题

网站不再单单迎合人类读者.许多站点现在支持一些 API,这些 API 使计算机程序能够获取信息.屏幕抓取 -- 将 HTML 页面解析为更容易理解的表单的省时技术 - 仍然很方便.但使用 API 简化 Web 数据提取的机会在快速增多.根据 ProgrammableWeb 的信息,在本文发表时,已存在 10,000 多个网站 API - 在过去的 15 个月中增加了 3,000 个.(ProgrammableWeb 本身提供了一个 API,可从其目录中搜索和检索 API.mashup.成员概要文