我正在尝试访问我在类中重写的模块函数。
{{1}}
但是我收到以下错误 -
{{1}}
有没有办法在不使用函数定义中的self.Hello的情况下访问模块函数。
答案 0 :(得分:1)
您展示了对OOP概念的完全误解。而且,BTW,Ruby中的方法名称不能以大写字母开头。
不能只在类层次结构中的某个地方调用任意方法。无论这是否可能,整个OOP都没有意义。
可以在此方法中调用super
方法 :
module Base
def hello
puts "Hello"
end
end
class Top
include Base
def initialize p
@p = p
end
def hello
if @p == 1
puts "hello from top"
else
super
end
end
def hi
hello
end
end
Top.new(1).hi
#⇒ hello from top
Top.new(2).hi
#⇒ Hello
或者,可以声明模块函数,a.k.a。静态函数并从任何地方调用它:
module Base
def self.hello
puts "Hello"
end
end
class Top
# NOT NEEDED include Base
def hello
puts "hello from top"
end
def hi
if p == 1
hello
else
Base.hello
end
end
end
答案 1 :(得分:1)
您可以这样做的一种方法是使模块的方法成为模块方法而不是实例方法。如果您在方法定义之前加上module_function
,那么两者将创建一个模块和一个实例方法。这将使您能够使用模块的名称访问模块方法(在本例中为BaseModule.hello
)。我已经将您的问题代码修改为基本要素并说明了它的工作方式:
#!/usr/bin/env ruby
module BaseModule
module_function
def hello
puts 'Hello from BaseModule'
end
end
class MyClass
include BaseModule
def hello
puts 'Hello from MyClass'
end
def module_hello
BaseModule.hello
end
end
MyClass.new.hello # Hello from MyClass
MyClass.new.module_hello # Hello from BaseModule
答案 2 :(得分:0)
如果要覆盖类中模块的实例方法,可以使用super
调用此方法。
module Base
def Hello
puts "Hello"
end
end
class Top
include Base
def Hello
if p == 1
puts "hello from top"
else
super
end
end
end
t = Top.new
t.Hello # => "Hello"
答案 3 :(得分:0)
您不理解include
的含义!
当您将一个模块包含在一个类模块中时,从一个模块中添加一个对象继承链。通过这种方式,您可以将这些方法称为自己。
module A
def hello
p 'Hello from A'
end
end
class MyClass
include A
end
2.2.2 :010 > mm = MyClass.new
=> #<MyClass:0x00000000ecaa68>
2.2.2 :011 > mm.hello
"Hello from A"
您可以在您的情况下使用next:
module B
def self.hello
p 'Hello from B'
end
end
class MyClass
def my_hello
B.hello #direct call from module B
end
end
还有一个注意事项:不要在方法中使用大写名称