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

所以执行后的输出是:

你好世界,我只是一个吵闹的班级
你好世界,A班来了

我认为不必要地使用eval是邪恶的。而且我不确定这里是否强制使用eval 。动态调用“BaseClass”类型的所有类是否有更智能的方法?

4

3 回答 3

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

你有看过class_eval吗?

-------------------------------------------------- ---- 模块#class_eval
     mod.class_eval(string [, filename [, lineno]]) => obj
     mod.module_eval {|| 块 } => 对象
-------------------------------------------------- ----------------------
     在 _mod_ 的上下文中评估字符串或块。这可以是
     用于向类添加方法。+module_eval+ 返回结果
     评估其论点。可选的 _filename_ 和 _lineno_
     参数设置错误消息的文本。

        类的东西
        结尾
        a = %q{def hello() "你好!" 结尾}
        Thing.module_eval(a)
        将 Thing.new.hello()
        Thing.module_eval("无效代码", "dummy", 123)

    产生:

        你好呀!
        dummy:123:in `module_eval': 未定义的局部变量
            或 Thing:Class 的方法“代码”
于 2009-02-03T18:40:28.087 回答
0

eval 是我所知道的将字符串转换为常量的唯一方法。它甚至是rails的方式:http: //api.rubyonrails.com/classes/Inflector.html#M001638

奇怪的是常量返回字符串。

于 2009-02-03T18:41:34.497 回答