Hol*_*ola 8 ruby activerecord metaprogramming ruby-on-rails
我试图理解这个电话:
deprecate :new_record?, :new?
Run Code Online (Sandbox Code Playgroud)
使用此弃用方法:
def deprecate(old_method, new_method)
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{old_method}(*args, &block)
warn "\#{self.class}##{old_method} is deprecated," +
"use \#{self.class}##{new_method} instead"
send(#{new_method.inspect}, *args, &block)
end
RUBY
end
Run Code Online (Sandbox Code Playgroud)
我真的不明白这里使用的元编程.但是,这只是别名new_record?方法的另一种方式- 所以实际上new_record?仍然可用,但是当你使用它时会发出警告吗?有人想解释一下这是如何工作的吗?
Ben*_*hes 10
好的,所以这里发生的是old_method的所有功能都已被程序员移动到new_method.为了使两个名称指向相同的功能但注意弃用,程序员放入deprecate行.这会导致<-RUBY heredoc(http://en.wikipedia.org/wiki/Heredoc)中指定的字符串在类级别被解释为代码(已评估).字符串插值的工作方式与普通的ruby字符串相同.
然后代码看起来像这样(如果我们要扩展元编程)
class SomeClass
def new?; true; end
deprecate :new_record?, :new? # this generates the following code
def new_record?(*args, &block)
warn "SomeClass#new_record? is deprecated," +
"use SomeClass#new? instead"
send(:new?, *args, &block)
end
end
Run Code Online (Sandbox Code Playgroud)
我希望这是有道理的
| 归档时间: |
|
| 查看次数: |
823 次 |
| 最近记录: |