0

以下のevalステートメントを削除することは可能ですか?以下のコードは、BaseClass型から派生したすべてのクラスを除外します。その後、これらのクラスがインスタンス化され、メソッド'hello'が呼び出されます。

module MySpace

  class BaseClass
    def hello; print "\nhello world"; end
  end

  class A<BaseClass
    def hello; super; print ", class A was here"; end
  end

  class B<BaseClass
    def hello; super; print ", I'm just a noisy class"; end
  end

  MySpace.constants.each do | e |
    c=eval(e)
    if c < BaseClass
      c.new.hello
    end
  end

end

したがって、実行後の出力は次のようになります。

hello world、私はただ騒々しいクラスです
hello world、クラスAはここにいました

evalの不必要な使用は悪だと思います。そして、ここでevalの使用が必須かどうかはわかりません。タイプ「BaseClass」からすべてのクラスを動的に呼び出すためのよりスマートな方法はありますか?

4

3 に答える 3

4
c = MySpace.const_get(e)
于 2009-02-03T18:40:16.933 に答える
0

class_eval代わりに見ましたか?

-------------------------------------------------- ---- Module#class_eval
     mod.class_eval(string [、filename [、lineno]])=> obj
     mod.module_eval {|| ブロック}=>obj
-------------------------------------------------- ----------------------
     _mod_のコンテキストで文字列またはブロックを評価します。これは
     クラスにメソッドを追加するために使用されます。+module_eval+はの結果を返します
     その議論を評価する。オプションの_filename_および_lineno_
     パラメータは、エラーメッセージのテキストを設定します。

        クラスシング
        終わり
        a =%q {def hello() "こんにちは!" 終わり}
        Thing.module_eval(a)
        Thing.new.hello()を置きます
        Thing.module_eval( "無効なコード"、 "ダミー"、123)

    生成:

        こんにちは!
        ダミー:123: `module_eval':未定義のローカル変数
            またはThing:Classのメソッド `code'
于 2009-02-03T18:40:28.087 に答える
0

evalは、文字列を定数に変換するために私が知っている唯一の方法です。Railsがそれを行う方法でさえ:http: //api.rubyonrails.com/classes/Inflector.html#M001638

奇妙なことに、定数は文字列を返します。

于 2009-02-03T18:41:34.497 に答える