使用类名称的动态类定义 [英] Dynamic Class Definition WITH a Class Name

查看:117
本文介绍了使用类名称的动态类定义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在Ruby中动态定义类名称?

我知道如何动态创建类 使用类似的名称:

I know how to create a class dynamically without a name using something like:

dynamic_class = Class.new do
  def method1
  end
end

但不能指定类名。我想动态创建一个类一个名称。

But you can't specify a class name. I want to create a class dynamically with a name.

这里是我想做的一个例子,但实际上并不工作。

(注意,我不是创建一个实例的类,但是类定义)

Here's an example of what I want to do but of course it doesn't actually work.
(Note that I am not creating an instance of a class but a class definition)

class TestEval
  def method1
    puts "name: #{self.name}"
  end
end

class_name = "TestEval"
dummy = eval("#{class_name}")

puts "dummy: #{dummy}"

dynamic_name = "TestEval2"
class_string = """
class #{dynamic_name}
  def method1
  end
end
"""
dummy2 = eval(class_string)
puts "dummy2: #{dummy2}" # doesn't work

实际输出:

dummy: TestEval
dummy2: 

所需输出:

dummy: TestEval
dummy2: TestEval2

============================================== ======

======================================================

答案:使用sepp2k方法的完全动态解决方案

dynamic_name = "TestEval2"

Object.const_set(dynamic_name, Class.new)
dummy2 = eval("#{dynamic_name}")
puts "dummy2: #{dummy2}"


推荐答案

类的名称只是引用它的第一个常量的名称。

The name of a class is simply the name of the first constant that refers to it.

Ie如果我做 myclass = Class.new ,然后 MyClass = myclass ,类的名称将变为 MyClass 。但是如果我不知道类的名称,直到运行时,我不能做 MyClass =

I.e. if I do myclass = Class.new and then MyClass = myclass, the name of the class will become MyClass. However I can't do MyClass = if I don't know the name of the class until runtime.

所以,你可以使用 Module#const_set ,它动态设置一个const的值。示例:

So instead you can use Module#const_set, which dynamically sets the value of a const. Example:

dynamic_name = "ClassName"
Object.const_set(dynamic_name, Class.new { def method1() 42 end })
ClassName.new.method1 #=> 42

这篇关于使用类名称的动态类定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆