How do I dynamically define a class in Ruby WITH a name?

我知道如何使用以下内容动态创建一个类:

dynamic_class = Class.new do
  def method1
  end
end

但不能指定类名.我想用一个名字创建一个类.

下面是我想做的一个例子,但当然它实际上不起作用

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

实际yields :

dummy: TestEval
dummy2: 

期望输出:

dummy: TestEval
dummy2: TestEval2

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

Answer: A totally dynamic solution using sepp2k's method

dynamic_name = "TestEval2"

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

推荐答案

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

也就是说,如果我先做myclass = Class.new,然后做MyClass = myclass,那么类的名称将变成MyClass.但是,如果我在运行时之前不知道类的名称,我就无法执行MyClass =.

因此,您可以使用Module#const_set,它可以动态设置常量的值.例子:

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

Ruby相关问答推荐

用函数组合枚举器的Ruby方法

Ruby 中无法解释的撬动行为

如何从 url 获取文件扩展名?

Ruby:子字符串到一定长度,也到子字符串中的最后一个空格

如何使用 capybara + cucumber 断言 ruby​​ 中的 html 表行数

如何在Ruby中从字符串中go 除前导和尾随引号

如何在没有继承方法的情况下获取类的公共方法?

osx bash上的树命令

如何通过反射获取 Ruby 的 Module 类定义的常量?

比较ruby中的两个字符串

按可能为 nil 的属性对对象的 ruby​​ 数组进行排序

Ruby注入初始为哈希

如何打破Ruby中的外循环?

Mountain Lion rvm 安装 1.8.7 x11 错误

将 CSV 文件转换为哈希数组

判断散列的键是否包含所有键集

Ruby 将 CSV 文件读取为 UTF-8 和/或将 ASCII-8Bit 编码转换为 UTF-8

Lisp 和 Erlang 原子、Ruby 和 Scheme 符号.它们有多大用处?

在ruby中将字符串转换为十进制数

如何使用#{variable}在Ruby中格式化带有浮点数的字符串?