gpt4 book ai didi

ruby - "super"如何与模块一起工作?

转载 作者:数据小太阳 更新时间:2023-10-29 07:15:22 26 4
gpt4 key购买 nike

我会在一个特定的例子(在 Rails 中)上问它。在“Destroy without Javascript (revised)”railscast 中,Ryan Bates 覆盖了 #resources 路由方法:

module DeleteResourceRoute
def resources(*args, &block)
super(*args) do
# some code
end
end
end

ActionDispatch::Routing::Mapper.send(:include, DeleteResourceRoute)

但是 Ruby 中的继承并不是以 模块 是“父类(super class)”的方式工作的。那么他怎么能从模块中调用 #super 呢?

如果可以像这样覆盖一个方法,那么人们不会这样做:

class SomeClass
alias old_method method
def method
# ...
old_method
# ...
end
end

可以做这样的事情:

class SomeClass
include Module.new {
def method
# ...
super
# ...
end
}
end

我错过了什么?

最佳答案

“ super ”仅存在于“类”上下文中。 super 不能存在于“纯模块”上下文中。所以,当你看到这样的代码时:

module DeleteResourceRoute
def resources(*args, &block)
super(*args) do
# some code
end
end
end

你应该有一个类来“包含这个模块”,然后“ super ”生效,例如

class SomeClass extends BaseClass
include DeleteResourceRoute
end

class BaseClass
def resources
puts "called parent!"
end
end

SomeClass.new.resources # => called parent!

关于ruby - "super"如何与模块一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12887139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com