Ruby中的访问模块功能

时间:2016-05-04 06:35:05

标签: ruby

我正在尝试访问我在类中重写的模块函数。

{{1}}

但是我收到以下错误 -

{{1}}

有没有办法在不使用函数定义中的self.Hello的情况下访问模块函数。

4 个答案:

答案 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

还有一个注意事项:不要在方法中使用大写名称