【问题标题】:Trying to alias old method and create new one in ruby尝试别名旧方法并在 ruby​​ 中创建新方法
【发布时间】:2015-05-11 17:08:46
【问题描述】:

我使用以下 sn-p 仅在方法存在时为该方法设置别名:

alias_method old_name, func_name if self.respond_to? func_name

self.respond_to? func_name 返回 true 时,alias_method': undefined method 'get' for class 'Sinatra::Base' (NameError) 怎么会出错?

func_name = :get 在这个 sn-p

【问题讨论】:

    标签: ruby respond-to


    【解决方案1】:

    我在this link找到了我的问题的一个很好的答案

    我没有修改原始类,而是创建一个模块,然后使用prepend 并调用super 来调用原始方法。 我现在这样做:

    Sinatra::Base.prepend Restman::Patches::Sinatra_Base_Patch
    

    使用模块Sinatra_Base_Patch 包含覆盖原始功能的功能。

    我遵循的例子是这样的:

    class Foo
      def bar
        'Hello'
      end
    end 
    
    module FooExtensions
      def bar
        super + ' World'
      end
    end
    
    class Foo
      prepend FooExtensions # the only change to above: prepend instead of include
    end
    
    Foo.new.bar # => 'Hello World'
    

    【讨论】:

      【解决方案2】:

      我打赌你在Sinatra::Base 的范围内调用alias_method。您应该在Sinatra::Base单例类 中调用它,因为方法get 被定义为类方法。

      【讨论】:

      • 啊!你是对的,我明白了,我不敢相信我错过了,谢谢你指出。
      【解决方案3】:

      语法是:

      alias_method :new_name, :func_name
      

      例如,您在记录中有一个名称属性:

      alias_method :to_s, :name
      

      【讨论】:

      • old_name & func_name 是存储值的变量,在这种情况下:old_name = :old_get & func_name = :get。奇怪的是,当我尝试使用instance_method(func_name) 将旧方法存储为UnBoundMethod 时,它会出现相同的错误(该方法不存在),但是执行puts Sinatra::Base.methods.sort.to_s 表明该方法:get 确实存在。
      猜你喜欢
      • 2022-01-18
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-08
      • 2015-03-01
      • 1970-01-01
      • 2017-02-17
      • 2014-01-17
      相关资源
      最近更新 更多