- 浏览: 143310 次
- 性别:
- 来自: 汉川
文章分类
最新评论
-
googya:
googya 写道axgle 写道define_method ...
令人迷惑的class_eval和instance_eval -
jinleileiking:
我绝不会这么写。呵呵
令我迷惑的c语言参数格式 -
googya:
jinleileiking 写道说的啥?那种写法是老C标准,现 ...
令我迷惑的c语言参数格式 -
jinleileiking:
说的啥?那种写法是老C标准,现在不这么搞了
令我迷惑的c语言参数格式 -
consy:
<p><span style="f ...
令人迷惑的class_eval和instance_eval
按照yugui
大姐的说法,class_eval和instance_eval有如下的区别:
class&instance_eval self default definee
class_eval the receiver the receiver
instance_eval the receiver eigenclass of the receiver
上面就是class_eval与instance_eval的区别了,一般情况下这个没有问题(个人感觉)。但还是会有令迷惑的地方。
下面的例子说明了,在下面情况下,class_eval和instance_eval的作用没有区别。
class A end class Object def eigenclass class << self;self;end end end A.class_eval do p self def hehe "hehe" end define_method(:xixi) do "xixi" end end A.instance_eval do p self def haha;"haha";p self ;end end A.instance_eval do p self define_method(:hihi) do "hihi" p self.to_s end end A.haha A.new.hihi p A.instance_methods p "*"*120 p A.eigenclass.instance_methods
定义的hihi和xixi都是A是实例方法。
jayfield
说到:
jayfield的说法应该是有问题的,但不这样理解,上面的例子怎么又说得通呢?
PS:可能是我表述不清还是怎么的,基本上没有人对此关注。实际上我想说的就是:
A.instance_eval do p self def haha;"haha";p self ;end end A.instance_eval do p self define_method(:hihi) do "hihi" p self.to_s end end
同样是用instance_eval,为什么有这么大的不同。
A.new.hihi A.haha
事实上,
A.instance_eval do
p self
define_method(:hihi) do
"hihi"
p self.to_s
end
end
与 class A
define_method(:hihi) do
"hihi"
end
end
的效果是一样的,define_method是个私有方法,能调用(隐式)它的只能是类对象而非一般的对象。
在一个网站
上看到了这个:
现在可以比较直观的理解这二者的不同了
评论
A.instance_eval do
p self
define_method(:hihi) do
"hihi"
p self.to_s
end
end
axgle说的是一般情况。上面这个例子就是定义了一个实例方法,如何解释?
给类对象创建一个实例方法。。。。。那个target就是 A,不管A用instance_eval 或者是 class_eval都是一样的
<p><span style="font-size: x-small;">顾名思义<br>instance_eval 就是实例级别的eval<br>class_eval 就是类级别的eval<br><br>A.instance_eval => open A's singleton instance<br>A.new.instance_eval => open A.new<br>A.class_eval => open A<br>class_eval很明显是把接受者当类来看待,所以这个方法只能由类对象来调用,A.class_eval中用def关键字定义方法自然是给A这个类定义方法,应该是</span><span style="font-size: x-small;">hf_cn81所说的ruby_class</span><span style="font-size: x-small;">,这跟类的定义差不多。而A.instance_eval则明显的把A当成一个对象,方法不是存储在对象中的,既然此处不把A当成类,那def定义的方法自然不能是给A定义的(因为A是对象而非类)。所以A.instance_eval中使用def关键字定义的方法就定义到了A这个对象的单例类中了,也就成了A的类方法。</span></p>
<p><span style="font-size: x-small;">我想大概是这样的,不知对也不对大家讨论...</span></p>
<p><span style="font-size: x-small;"><br></span></p>
<div class="quote_div">
<p>instance_eval里的self就是receiver,这和class_eval没有区别,所以</p>
<p>A.instance_eval do</p>
<p><span style="white-space: pre;"> </span>puts self</p>
<p>end</p>
<p> </p>
<p>A.class_eval do</p>
<p><span style="white-space: pre;"> </span>puts self</p>
<p>end</p>
<p>打印的结果一样,但是instance_eval改变了“ruby_class”到A的meta class,而class_eval则将“ruby_class"改成A。</p>
<p>def定义的方法是做为”ruby_class“的实例方法,而define_method定义的方法是作为self的实例方法。</p>
<p> </p>
</div>
<p>回头看看还是hf_cn81说的比较到位</p>
1、很多人很轻视这个问题。yehuda这个Ruby顶尖高手都曾经在这个问题上犯过错误, 可 见这个问题确实有点迷惑性,因而我觉得有讨论它的价值。从回帖的情况来看,并不是所有人都认清了这个问题的本质。
2、不宽容。那些没有留下只言片语却投了新手帖的人,我不知道他们是什么心态。难道他们都是nb的不行的人物?也许吧,那请你回答这个问题啊,或者可以给点提示、努力的方向都可以啊。
当然对我而言,确实是Ruby新手。但是这个问题却不是那么的simple,也不是那么的stupid。
instance_eval 就是实例级别的eval
class_eval 就是类级别的eval
A.instance_eval => open A's singleton instance
A.new.instance_eval => open A.new
A.class_eval => open A
嗯,你说的不错,确实,按照字面上的理解确实如此!
但是关键的问题在于:
A.instance_eval do define_method(:hihi) do "hihi" p self.to_s end end
这二者的组合产生的效果是什么样的。
A.instance_eval 打开了通往A的eigenclass 的门,在那个门内的方法,按道理来说,仅仅是为A定义的,也就说应该是A单独享有的方法(其实例都不能享有)。但是实际的情况并非如此!,hihi这个方法是为A的实例定义的,这也是我疑惑的地方所在。
不过我想我已经弄清楚了具体的原因!
instance_eval 就是实例级别的eval
class_eval 就是类级别的eval
A.instance_eval => open A's singleton instance
A.new.instance_eval => open A.new
A.class_eval => open A
正解!
instance_eval 就是实例级别的eval
class_eval 就是类级别的eval
A.instance_eval => open A's singleton instance
A.new.instance_eval => open A.new
A.class_eval => open A
A.instance_eval{puts self}
A.class_eval{puts self}
出来的结果都是A
所以在这两个里面的define_method都是给A定义一个实例方法
instance_eval与class_eval只是给define_method提供了一个self环境
关键问题是:这个target是指的什么
instance_eval,名字上就有instance,就是实例。
什么是实例?a = A.new ,这个a就是实例。
我再自问一句,a实例是什么?
因为在ruby世界里什么都是对象,那个a这个对象其实就是A的单例。
所以你可以这样
def a.method1
puts 'this is singleton method'
end
a.method1
所以也会有
class A
end
a = A.new
a.instance_eval do
self # => a
# current class => a's singleton class
def method1
puts 'this is a singleton method of instance a'
end
end
a.method1
#=> this is a singleton method of instance a
b = A.new
b.method1
#=>NoMethodError: undefined method `method1' for #<A:0x10043ff70>
我在想,Ruby是一个语言的大杂烩,不会像Python那样优雅,所以它一定是遵循一种简单的语义。所以我们不能像别其它语言那样,把高度看太高,其实想过来很简单。
coding in fun!
============
class_eval是为Class定义函数。
我知道只要在Class里定义的函数,它的实例就相应得到了这些函数。
class A
end
a = A.new
a.method1
#=> NoMethodError: undefined method `method1' for #<A:0x10043ff70>
A.class_eval do
self # => A
# current class => A
def method1
puts 'this is a instance method of class A'
end
end
a.method1
#=> this is a instance method of class A
参考:
http://note.jiaeil.com/2010/05/16/digging-ruby-instance_eval-and-class_eval/
<div class="quote_div">
<p>instance_eval里的self就是receiver,这和class_eval没有区别,所以</p>
<p>A.instance_eval do</p>
<p><span style="white-space: pre;"> </span>puts self</p>
<p>end</p>
<p> </p>
<p>A.class_eval do</p>
<p><span style="white-space: pre;"> </span>puts self</p>
<p>end</p>
<p>打印的结果一样,但是instance_eval改变了“ruby_class”到A的meta class,而class_eval则将“ruby_class"改成A。</p>
<p>def定义的方法是做为”ruby_class“的实例方法,而define_method定义的方法是作为self的实例方法。</p>
<p> </p>
</div>
<p> </p>
<p> </p>
<p>照你的意思,instance_eval中应该有2个不同的self.一个是可以打印出来的的那个,一个就是更改后的ruby_class。对吗?</p>
<p>A.instance_eval do</p>
<p><span style="white-space: pre;"> </span>puts self</p>
<p>end</p>
<p> </p>
<p>A.class_eval do</p>
<p><span style="white-space: pre;"> </span>puts self</p>
<p>end</p>
<p>打印的结果一样,但是instance_eval改变了“ruby_class”到A的meta class,而class_eval则将“ruby_class"改成A。</p>
<p>def定义的方法是做为”ruby_class“的实例方法,而define_method定义的方法是作为self的实例方法。</p>
<p> </p>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"><span style="color: black;">A.instance_eval </span><span class="keyword" style="color: #7f0055; font-weight: bold;">do</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;">p <span class="keyword" style="color: #7f0055; font-weight: bold;">self</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> <span class="keyword" style="color: #7f0055; font-weight: bold;">def</span><span style="color: black;"> haha;</span><span class="string" style="color: blue;">"haha"</span><span style="color: black;">;p </span><span class="keyword" style="color: #7f0055; font-weight: bold;">self</span><span style="color: black;"> ;</span><span class="keyword" style="color: #7f0055; font-weight: bold;">end</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"><span class="keyword" style="color: #7f0055; font-weight: bold;">end</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> </span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;">A.instance_eval <span class="keyword" style="color: #7f0055; font-weight: bold;">do</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;">p <span class="keyword" style="color: #7f0055; font-weight: bold;">self</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> <span class="keyword" style="color: #7f0055; font-weight: bold;">define_method</span><span style="color: black;">(</span><span class="symbol" style="color: #aa7700;">:hihi</span><span style="color: black;">) </span><span class="keyword" style="color: #7f0055; font-weight: bold;">do</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> <span class="string" style="color: blue;">"hihi"</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> p <span class="keyword" style="color: #7f0055; font-weight: bold;">self</span><span style="color: black;">.to_s </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> <span class="keyword" style="color: #7f0055; font-weight: bold;">end</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"><span class="keyword" style="color: #7f0055; font-weight: bold;">end</span><span style="color: black;"> </span></span></li>
</ol></span></span></p>
<p>def 是ruby的关键字,他会定义方法到当前的ruby_class(一个隐藏的变量), instance_eval会改变ruby_class,使之成为receiver(A)的meta class(而class_eval则将其变为receiver),所以def定义的方法,就是A的方法(类方法)或者说是A的meta class的实例方法, define_method是ruby中Module的方法,用于定义self的实例方法,instance_eval不会改变self,所以hihi是A的实例方法。</p></div><br/>instance_eval 肯定会改变self,无论是用def或者define_method这点可以保证的。
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"><span style="color: black;">A.instance_eval </span><span class="keyword" style="color: #7f0055; font-weight: bold;">do</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;">p <span class="keyword" style="color: #7f0055; font-weight: bold;">self</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> <span class="keyword" style="color: #7f0055; font-weight: bold;">def</span><span style="color: black;"> haha;</span><span class="string" style="color: blue;">"haha"</span><span style="color: black;">;p </span><span class="keyword" style="color: #7f0055; font-weight: bold;">self</span><span style="color: black;"> ;</span><span class="keyword" style="color: #7f0055; font-weight: bold;">end</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"><span class="keyword" style="color: #7f0055; font-weight: bold;">end</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> </span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;">A.instance_eval <span class="keyword" style="color: #7f0055; font-weight: bold;">do</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;">p <span class="keyword" style="color: #7f0055; font-weight: bold;">self</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> <span class="keyword" style="color: #7f0055; font-weight: bold;">define_method</span><span style="color: black;">(</span><span class="symbol" style="color: #aa7700;">:hihi</span><span style="color: black;">) </span><span class="keyword" style="color: #7f0055; font-weight: bold;">do</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> <span class="string" style="color: blue;">"hihi"</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> p <span class="keyword" style="color: #7f0055; font-weight: bold;">self</span><span style="color: black;">.to_s </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"> <span class="keyword" style="color: #7f0055; font-weight: bold;">end</span><span style="color: black;"> </span></span></li>
<li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px;"><span style="color: black;"><span class="keyword" style="color: #7f0055; font-weight: bold;">end</span><span style="color: black;"> </span></span></li>
</ol></span></span></p>
<p>def 是ruby的关键字,他会定义方法到当前的ruby_class(一个隐藏的变量), instance_eval会改变ruby_class,使之成为receiver(A)的meta class(而class_eval则将其变为receiver),所以def定义的方法,就是A的方法(类方法)或者说是A的meta class的实例方法, define_method是ruby中Module的方法,用于定义self的实例方法,instance_eval不会改变self,所以hihi是A的实例方法。</p>
A.instance_eval do
p self
define_method(:hihi) do
"hihi"
p self.to_s
end
end
axgle说的是一般情况。上面这个例子就是定义了一个实例方法,如何解释?
发表评论
-
ruby中数字与数字字符串相加的原理
2011-05-13 13:20 4291在ruby的世界中,很多东西不怕你做不到,就怕你想不到。正所谓 ... -
ruby删除文件注意事项
2011-05-05 18:45 1203用ruby删除文件的时候一定要注意,要将文件流关闭之后 ... -
VM的cloudfoundry试用
2011-04-26 17:18 1218今天收到了cloudfoundry的邮件通知,说我 ... -
用ruby调用外部命令移动文件,结果悲剧了
2010-12-12 12:45 1542今天要把storage上的文件移动一下,结果发现命令g ... -
寻找最长递增数字子串
2010-10-17 18:55 3021有一个字符串,其中包含了多个数字子串,要求求出最长的递 ... -
打印图形(很基础的)
2010-10-11 17:48 1205想不到有家公司的笔试题中居然有一道打印图形的题目,更让 ... -
用Rubinius来学习Ruby
2010-09-14 14:54 1185matz的ruby是基于c语言的,很多的核心的类都是 ... -
2个空瓶换一瓶汽水问题
2010-06-12 15:53 23601块钱可以买一瓶汽水,两个瓶可以换1瓶汽水,那 ... -
base64编码
2010-06-03 08:12 991受有道难题中许多答复者的启发,我决定对base ... -
有道难题
2010-05-30 16:08 1021有道的工程师闲暇之余,将Base64编码改成了Base ... -
Ruby入门读物
2010-05-23 12:39 1313经过一段时间的Ruby学习,感觉现在比刚开始时 ... -
计算相似程度、推荐
2010-05-05 10:07 1096在聚类分析中,尤其是文本聚类中通常要进行2对象 ... -
顶级上下文环境
2010-03-31 15:47 909到现在才明白,在IRB中写一个方法,就是给Object对象增加 ... -
jruby on rails
2010-03-19 16:15 1158今天终于在机器上把jruby on rails配置成功 ... -
java静态方法与jruby(ruby)类方法
2010-03-19 10:07 1345在学习ruby的时候,我感觉对于各种级别的方法有更清晰 ... -
ruby收取邮件
2010-01-28 16:12 1409这几天想复习一下ruby,很久没有用了,很多东西都忘记了!于是 ... -
格式化输出(字符串到数)
2009-12-31 11:05 1142很简单的一个练习,主要是将字符串转换为数组,然后添加一些其他的 ... -
ruby中的字符编码
2009-09-24 16:15 5864长期以来,都被Ruby中的字符乱码所困惑,但是一直高估 ... -
Java的内部类与Ruby的内部类的区别
2009-08-23 16:06 1446今天经过night-stalker的提醒,突然意识到Rub ... -
impl与内部类
2009-08-23 11:20 1187# To change this template, choo ...
相关推荐
`define_method`和`class_eval`是Ruby元编程中的两个关键方法,它们被广泛用于动态地添加方法到类或者模块中。这篇文章将深入探讨这两个方法的用法和区别。 `define_method`方法允许我们传递一个符号和一个代码块来...
**instance_eval** 和 **class_eval** 虽然都是用来执行代码块的方法,但它们之间存在一些重要的区别: ##### 2.1 instance_eval - **调用者**: 必须是一个实例。 - **内部的self**: 在 `instance_eval` 块内部,`...
核心-Ruby-1 类的存储库。... 不要作恶:class_eval 和 instance_eval。 常量、实例变量 API。 6 自由修补。 改进。 关键字参数。 在 2.1 中风靡一时。 7 线程或:我如何学会停止担心并学会热爱 GI
在模拟`eval()`功能时,我们可能需要使用`Class.forName()`加载类,`Method.invoke()`执行方法,或者`Constructor.newInstance()`创建对象。通过这些反射方法,我们可以解析字符串并执行相应的Java代码。 2. **Java...
通过`eval`, `send`, `instance_eval`, `class_eval`, 动态方法定义,以及`Proc`和`Lambda`等工具,开发者能够创建出更具适应性和可扩展性的代码。在实际项目中,合理利用元编程可以提高代码的效率和可维护性,但...
6. 实例化时方法注入(Instance_eval & Class_eval):这些方法可以改变当前对象的上下文,允许你访问或修改实例变量和方法。`instance_eval`允许你评估一段代码并将其作用域限定在当前实例上,而`class_eval`则用于...
8. **元编程**:探索Ruby的send方法、class_eval、instance_eval等元编程技巧。 9. **Gem和包管理**:了解Ruby的包管理系统RubyGems,以及如何安装和使用第三方库。 10. **Ruby on Rails**:如果文档包含相关内容,...
书中会讲解send、class_eval、instance_eval等元编程工具的使用。 6. **标准库**:Ruby的标准库提供了大量实用的模块和类,如File、Net、Time等,可以帮助开发者快速实现各种功能。 7. **Ruby on Rails**:虽然...
`class_eval`和`module_eval`允许在类或模块上下文中执行字符串或块作为代码。 3. **对象的反射**:`Object#methods`、`Class#methods`等方法返回对象或类可调用的方法列表。`instance_variable_get`和`instance_...
理解如何使用`eval`、`class_eval`和`instance_eval`,以及如何利用`send`和`method_missing`进行消息传递,是提升Ruby编程技巧的关键。 《ruby23.chm》文档可能是整个Ruby语言的综合指南,可能包含前面几个文档的...
8. **元编程**:Ruby的元编程能力是其一大特色,通过`class_eval`、`instance_eval`和`define_method`等方法,可以在运行时动态修改类和对象的行为。 9. **线程与并发**:Ruby 1.9.3引入了全局解释器锁(GIL),...
例如,你可以使用`define_method`动态定义方法,或者使用`class_eval`或`instance_eval`在运行时改变类的行为。这种特性极大地增强了代码的灵活性和可扩展性。 《Ruby Way》一书还会详细介绍Ruby的Gem包管理器,Gem...
例如,读者将学习到如何使用 `class_eval` 和 `instance_eval` 动态定义类和方法,以及 `send` 方法的用法。 此外,本书还会涵盖Ruby的错误处理和异常处理机制,以及测试驱动开发(TDD)和集成测试的相关知识,帮助...
Ruby的元编程能力,如`class_eval`、`instance_eval`和`define_method`等方法,使得动态修改类和对象的行为变得容易,这在实现某些设计模式时特别有用。例如,元编程可以用来在运行时添加方法,实现动态代理或者创建...
6. **元编程**:Ruby的元编程特性,如`class_eval`、`instance_eval`、`method_missing`等,以及如何利用它们来增强代码的动态性。 7. **测试驱动开发(TDD)**:Ruby社区非常注重TDD,因此可能包含关于Rspec或Test::...
通过`eval`函数、`instance_eval`、`class_eval`等方法,开发者可以在运行时动态修改或创建代码。这使得Ruby在构建高度自定义和灵活的系统时具有极大的优势。 Ruby的工具生态也非常丰富,其中最著名的是Ruby on ...
了解 `class_eval`、`instance_eval`、`define_method` 等方法可以帮助你更深入地掌握这一特性。 6. **测试驱动开发(TDD)**:Ruby 社区强调 TDD,因此熟悉 RSpec 或 MiniTest 这样的测试框架是必要的。学会编写...
`eval`函数可以执行字符串作为Ruby代码,`send`方法可以动态调用对象的方法,而`instance_eval`和`class_eval`则可以在特定上下文中执行代码,极大地增加了代码的灵活性。 在Ruby 2.5.1中,标准库也得到了增强,...
例如,你可以使用`define_method`动态定义方法,或者使用`class_eval`或`instance_eval`来执行字符串中的代码,这在编写灵活的框架或库时非常有用。 此外,Ruby的标准库非常丰富,提供了大量实用的模块和函数。例如...