Method
对象是由
Object#method(:method_name)
方法创建的,且与一个特定对象相关联(而不是与一个类关联)。它们可以被用于调用这个对象内的方法,就像与迭代器关联的块一样。
Method
对象封装了方法的实体
(
是内容而不是方法名
)
和被调对象
(
即持有这个方法的对象
)
。
Method
对象与
Proc
对象的区别在于:在生成
Method
对象之前必须有可供提取的方法,而
Proc
对象则没有这些限制。由此可见,
Proc
对象用过即抛型,而
Method
对象是反复利用型。另外,两者内部包含的代码规模也有不同。
Proc
对象包含的代码较少,而
Method
对象包含的代码较多。
例如:
class Thing
def square(n)
n*n
end
end
aThing = Thing.new
#
创建对象
aMethod = aThing.method("square")
#
获取与这个对象相关联的
Mehtod
对象。
aMethod.call(9)
#-> 81
[ 1, 2, 3 ].collect(&aMethod)
#-> [1, 4, 9]
在下面情况,
Method
对象是非常有用的:
class Foo
def foo() "foo" end
def bar() "bar" end
def baz() "baz" end
end
obj = Foo.new
#
将索引与方法的关系存入哈希表中
methods = {1 => obj.method(:foo), 2 => obj.method(:bar), 3 => obj.method(:baz)}
#
使用索引调出相关方法
p methods[1].call
# => "foo"
p methods[2].call
# => "bar"
p methods[3].call
# => "baz"
上面的例子中将生成的
Method
对象固化在了哈希表中。若不想固化被调对象时,可以使用
Object#send(:method_name)
方法。
class Foo
def foo() "foo" end
def bar() "bar" end
def baz() "baz" end
end
#
将索引和方法
(
名
)
的关系存入哈希表
#
请注意
,
此时并不包括被调的信息
#
所以,你可存入任意的方法名。反正此处无被调信息。
methods = {1 => :foo, 2 => :bar, 3 => :baz}
#
使用索引调出相关方法
#
被调可以是任意对象
(
并不一定是
Foo
类的实例
)
p Foo.new.send(methods[1])
# => "foo"
p Foo.new.send(methods[2])
# => "bar"
p Foo.new.send(methods[3])
# => "baz"
分享到:
相关推荐
方法参考以编译器安全的方式引用 Method 对象的 Java 项目
当执行Mapper方法时,MyBatis使用MapperProxy的invoke方法创建或获取缓存的MapperMethod对象。MapperMethod负责判断SQL操作类型(增删改查)并执行相应操作。在此过程中,Executor组件发挥关键作用,它封装了JDBC...
Chp15 反射Key Point ●Class 对象及其基本操作●Method 对象以及invoke 方法●标注练习 1. (类对象)要获得类对象,有三种不同的方式,分别为_____________________、___________________、_____________________...
这样你就可以使用 Constructor 创建新的对象,用 get() 和 set() 方法读取和修改与 Field 对象关联的字段,用invoke() 方法调用与 Method 对象关联的方法。 另外,还可以调用 getFields() getMethods
在永久域中jvm则存储class和method对象。就配置而言,永久域是一个独立域并且不认为是堆的一部分。 下面介绍如何控制这些域的大小。可使用-Xms和-Xmx 控制整个堆的原始大小或最大值。 下面的命令是把初始大小设置...
张建中 c#面向对象设计模式之abstract method视频教程
6.7METHOD对象203 6.8函数式编程205 第7章类和模块213 7.1定义一个简单类214 7.2方法可见性:PUBLIC、PROTECTED、PRIVATE232 7.3子类化和继承234 7.4对象创建和初始化241 7.5模块247 7.6加载和...
变量 类和实例变量的Variable对象Ruby 已经有了Method对象,为什么还没有Variable对象呢?为什么? 一些与类和实例变量交互的方法已经存在: Module#class_variable_defined? Module#class_variable_get Module#...
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) (Level 300)
获取类内部信息2.1 构造函数2.1.1 获取构造函数2.1.2 使用构造函数构造实例2.2 Field 对象2.2.1 获取 Field 对象2.2.2 Field 的 set,get 操作2.3 Method 对象2.2.1 获取 Method 对象2.2.2 Method 的 invoke 操作3....
安卓逆向学习笔记之ART中的C++对象内存布局及获取art-method和dex-file对象.docx
通过Class对象来获取Method对象,需要考虑的内容有: 参数 方法名 权限修饰符 【方法】 (1)Method[] getMethods(); 获取类内所有public成员方法,包括继承而来的public方法。 (2)Method[] getDeclaredMethods(); ...
对象 Abstract Factory Builder Prototype Singleton Adapter_Object Bridge Composite Decorator Facade Flyweight Proxy Chain of Responsibility Command Iterator Mediator Memento Observer ...
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) 体验课程
利用Method对象,这个对象很像C++中的指针函数。 Class类 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。 获取类字节码方式 Class.forName(); ...
C#面向对象设计模式纵横谈:Factory Method 工厂方法模式(创建型模式)
本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别...