0

我在一个类上定义了一个实例方法:

class Foo
  def is_linux
    # some code...
    # returns true or false
  end
end

我想在一个模块中调用这个方法:

class Foo
  module Dog
    is_linux? ? puts "Is Linux" : puts "Is Windows"
  end
end

这给了我以下错误:

NoMethodError: undefined method `is_linux?' for Foo::Foo:Module

我知道我会写

class Foo
  module Dog
    Foo.new.is_linux? ? puts "Is Linux" : puts "Is Windows"
  end
end

但我想知道模块是否有办法访问当前实例?

4

2 回答 2

1

基本上,您需要以某种方式“共享”您的实用程序方法。

我建议将它们放入mixin:

module Mixin
  def is_linux?
    true
  end
end

class Foo
  include Mixin # adding methods at instance level
end

class Foo
  module Dog

    extend Mixin # adding methods at class level

    puts is_linux? ? "Is Linux" : "Is Windows"

  end
end

#=> Is Linux
于 2012-11-25T01:00:15.150 回答
1

没有这样的选项,因为子类型(如模块)没有与其父实例连接。如果你需要这样的构造,你只能制作is_linux?类方法。如果没有这种可能性,那么很可能你的设计是错误的。

于 2012-11-25T00:06:04.803 回答