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

サブタイプ(モジュールなど)は親インスタンスに接続されていないため、このようなオプションはありません。そのような構成が必要な場合は、is_linux?クラスメソッドしか作成できません。そのような可能性がない場合は、おそらくあなたは間違ったデザインを持っています。

于 2012-11-25T00:06:04.803 に答える
1

基本的に、ユーティリティメソッドを「共有」する必要があります。

それらをミックスインに入れることをお勧めします:

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 に答える