尝试为旧方法添加别名并在 ruby 中创建新方法
Trying to alias old method and create new one in ruby
我使用以下代码片段仅在方法存在时为该方法添加别名:
alias_method old_name, func_name if self.respond_to? func_name
当 self.respond_to? func_name
returns 为真时,alias_method': undefined method 'get' for class 'Sinatra::Base' (NameError)
怎么会出错?
func_name = :get
在此片段中
语法是:
alias_method :new_name, :func_name
例如,您在记录中有一个名称属性:
alias_method :to_s, :name
我在 this link
找到了很好的问题答案
我没有对原始 class 进行猴子修补,而是创建了一个模块,然后使用 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'
我打赌你在 Sinatra::Base
的范围内调用 alias_method
。您应该在 Sinatra::Base
的 单例 class 中调用它,因为方法 get
被定义为 class 方法。
我使用以下代码片段仅在方法存在时为该方法添加别名:
alias_method old_name, func_name if self.respond_to? func_name
当 self.respond_to? func_name
returns 为真时,alias_method': undefined method 'get' for class 'Sinatra::Base' (NameError)
怎么会出错?
func_name = :get
在此片段中
语法是:
alias_method :new_name, :func_name
例如,您在记录中有一个名称属性:
alias_method :to_s, :name
我在 this link
找到了很好的问题答案 我没有对原始 class 进行猴子修补,而是创建了一个模块,然后使用 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'
我打赌你在 Sinatra::Base
的范围内调用 alias_method
。您应该在 Sinatra::Base
的 单例 class 中调用它,因为方法 get
被定义为 class 方法。