新手问题 关于方法调用的问题

cbdfocus · 2015年07月24日 · 最后由 billy 回复于 2015年07月24日 · 1727 次阅读

想在这个例子的 My 类中 doit 方法调用 My_a 的 dosth(),要怎么写呢?『有木有 Java 的 static 方法一说?』 如果要用 obj0 来调用 My_a 的 dosth 又该怎么写呢?

谢谢社区的朋友了

module My_a
  def dosth
    puts "This is A do sth."
  end
end

module My_b
  def dosth
    puts "This is B do sth."
  end
end

class My
  include My_a
  include My_b

  def doit
    puts "明确调用My_a的dosth方法.\n"

  end
end

obj0 = My.new
obj0.doit
class My
  include My_b
  include My_a
 # 注意顺序

  def doit
    puts "明确调用My_a的dosth方法.\n"
    dosth
  end
end

也可用prepend

class My
  prepend My_a
  include My_b

  def doit
    dosth

  end
end

obj0 = My.new
obj0.doit       # This is A do sth.

#1 楼 @googya 谢谢。 在不分析 ancestors 的情况下,可以有别的方法来解决吗? 比如 My_a::dosth 之类的,但是这样写好像不可以的~

#2 楼 @piecehealth 噢,谢谢! 但是我更想用一种明确的方式来调用,有推荐吗?

module My_a 

   def self.dosth
      puts "This is A do sth."
   end
   # 或者
    class << self
        def dosth
           puts "This is A do sth."
        end
    end

end

# My_a 也是一样的

class My
   include My_a
   include My_b

   def doit
       puts "明确调用My_a的dosth方法.\n"
      My_a. dosth
   end
end

# 调用: My.new.doit

定义 self 方法相当于 Java 中的静态方法

#4 楼 @cbdfocus

module My_a
  def self.dosth
    puts "This is A do sth."
  end
end

class My
  def doit
    My_a::dosth
  end
end

obj0 = My.new
obj0.doit

#5 楼 @winnie
😊 另,『class << self』这个是定义的内部类吗?module 不能实例化吧,要怎么用呢?

class << self 相当于 批量定义静态方法,上面的代码就是可以直接用的,你好好看看,最后一行可以去掉注释。

重名、加载顺序依赖,这些都是很丑的。别想着怎么调用 A 的重名方法了,要是 moduleA 和 moduleB 都是你写的,赶紧把它们改了,如果 moduleB 对 moduleA 有依赖,那就把加载 A 的部分放在 B 里面,My 只用加载 B 就行了,这些名字什么的由 B 自己去解决。

另外,mixin 本身也不是什么万能的东西。如果复杂到要考虑的太多,你要想想 mixin 是不是真的适合这个场景。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号