8

我试图理解这个电话:

deprecate :new_record?, :new?

它使用这种弃用的方法:

   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

我不太了解这里使用的元编程。但是,这只是别名new_record?方法的另一种方式吗?实际上,new_record?它仍然可用,但在您使用它时会发出警告?有人想解释一下这是如何工作的吗?

4

1 回答 1

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

我希望这是有道理的

于 2009-06-21T01:01:50.477 回答