Ruby 1.9概要(2)Kernel和Object
2023-03-14 10:25:00 时间
二、Kernel 和 Object
1、引入了BasicObject对象,作为一个顶级的空白状态对象:
引入这个对象对于Ruby对象体系带来的影响我还不清楚。
2、instance_exec方法,允许传递参数、self到一个block并执行之,也就是说为特定的instance执行block。
更多例子:
在Ruby 1.8中实现这个方法:
3、Kernel的require方法载入的文件将以完整路径存储在变量$"中,等价于:
通过在irb中观察$"变量即可看出差别。
4、Object#tap方法,将对象传入block并返回自身,用于链式调用:
5、Kernel#instance_variable_defined?方法:
6、Object#=~
匹配失败的时候返回nil而不是false
7、Kernel#define_singleton_method 方法,
8、Kernel#singleton_methods, Kernel#methods,返回的是将是方法名symbol组成的数组,过去是方法名的字符串数组。
文章转自庄周梦蝶 ,原文发布时间 2008-10-01
1、引入了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
相关文章
- 使用托管节点组结合启动模板简化EKS升级与运维
- 如何将您的自定义容器镜像导入Amazon SageMaker Studio notebooks
- 如何注册成为亚马逊云科技 Marketplace海外区卖家
- 如何使用数据网格创建现代包装消费品 (CPG)行业数据架构
- 预处理日志以便在 Amazon ES 中进行异常检测
- java deque_java 集合框架(十五)Deque
- 基于AI技术的智能剪辑方案
- 使用 AWS Backup Audit Manager 监控、评估和证明备份合规性
- Amazon EC2!15 岁生日快乐!
- java lamda_Java 8中,lamda函数编程
- 关于Amazon EKS中Service和Ingress深入分析和研究
- 游戏公司多账号管理(一)
- 新增 — 由最新一代英特尔至强可扩展处理器提供支持的 Amazon EC2 M6i 实例
- 在AWS上使用AlphaFold进行蛋白质结构预测
- 在亚马逊云科技Marketplace上的SaaS架构设计——如何支持跨多账户对接
- minicap java_Java JLabel.LEFT属性代码示例
- 在亚马逊云科技Marketplace上的SaaS架构设计——如何支持多产品使用单一账户中心
- 关于Amazon EKS基于Gitlab的CICD实践二 基础架构和应用架构创建篇
- 利用 Amazon Transcribe Call Analytics 从客户对话中提取见解
- 在 2021 年,AWS 连续第 11 年在云基础设施和平台服务 Gartner 魔力象限 (CIPS) 被评为领导者