-1

簡単な例を次に示します。

def abc
    puts 'abc'
end

class Foo
    def self.bar
        abc
    end
end

Foo.bar

abcは内部で定義されていないため、これは壊れFoo.barます。上記の作業を行うためにローカルバインディングを「継承」するようにクラスに指示する方法はありますか? 基本的に、「バー」メソッド用の単純な名前空間を作成しようとしています。

私の最初の試みは、現在の固有クラス ( class Foo < (class << self; self; end)) からサブクラス化することでしたが、仮想クラスをサブクラス化することはできません。また、バインディングを明示的に渡して内部で eval を使用することもできますが、それは私が探しているものではありません。

4

3 に答える 3

1

単純な名前空間だけが必要な場合、モジュールを使用できますか?

def abc
  puts 'abc'
end

module Foo
  def self.bar
    abc
  end
end

Foo.bar #=> abc
于 2012-10-25T17:37:16.213 に答える
1

これはどう

しかし、私は一般的に自分でそれをするようにアドバイスしません

def abc
    puts 'abc'
end

class Foo
    def self.bar
        eval("abc",TOPLEVEL_BINDING)
    end
end

Foo.bar
于 2012-10-25T17:35:25.657 に答える
1

abcは内部で定義されていないため、これは壊れFoo.barます。

いいえ、そうではありません。クラス IS-Aabcのプライベート インスタンス メソッドとして暗黙的に定義されているため、問題なく呼び出すことができます。あなたが投稿したコードはそのままで機能するはずであり、実際に私にとって機能します。ObjectObject

于 2012-10-25T23:05:44.577 に答える