我正在尝试用ruby编写一个脚本,其中涉及到将字符串转换为类名。由于我使用的是纯ruby,所以不能使用.constantize。我尝试使用Object.const_get('String'),但不确定为什么它会抛出uninitialized constant String (NameError)文件顶部有require 'active_support'
.constantize
Object.const_get('String')
uninitialized constant String (NameError)
require 'active_support'
hmmo2u0o1#
为匿名类分配名称的常规方法如下。
bub = Class.new do def b 'hi' end end str = 'Bubba' Object.const_set(str, bub) Bubba.is_a?(Class) #=> true Bubba.new.b #=> "hi"
这就是您想要做的吗?如果是的话,正如您所看到的,您需要使用模块#const_set。
watbbzwu2#
您是否尝试将const_get仅用于类,或者它位于类似ModuleA::ModuleB::ClassName的命名空间下?是否也将字符串转换为类名以生成新类或为其赋值?我问这些问题是因为答案会影响你要用的方法,也许const_set而不是const_get才是正确的方法,我不知道。
const_get
ModuleA::ModuleB::ClassName
const_set
2izufjch3#
从你给出的注解来看,'String'只是一个例子,而不是你传递给const_get的值。实际的值显然是'Assign',这对吗?当您执行Object.const_get('Assignment')并收到uninitialized constant错误时,它表示此时类Assignment尚未加载。当你使用Rails时,如果文件在正确的文件夹中,并且类遵循命名约定,那么会发生很多自动加载。因为你正在运行一个“独立的”ruby脚本,所以不会发生自动加载,你需要自己加载文件。添加一行,如require_relative "somepath/assignment"somepath需要适应您的目录/文件布局。它将加载文件并执行该文件中的ruby代码。如果assignment.rb定义了类似于
'String'
Object.const_get('Assignment')
uninitialized constant
Assignment
Rails
require_relative "somepath/assignment"
somepath
assignment.rb
class Assignment end
那么const_get就可以工作了。话虽这么说:你的具体用例是什么?2为什么你需要动态地查找类?3另外请注意,如果你让用户输入定义加载什么类,这会给你的应用程序带来(一个不太可能的)潜在的安全问题。
3条答案
按热度按时间hmmo2u0o1#
为匿名类分配名称的常规方法如下。
这就是您想要做的吗?如果是的话,正如您所看到的,您需要使用模块#const_set。
watbbzwu2#
您是否尝试将
const_get
仅用于类,或者它位于类似ModuleA::ModuleB::ClassName
的命名空间下?是否也将字符串转换为类名以生成新类或为其赋值?
我问这些问题是因为答案会影响你要用的方法,也许
const_set
而不是const_get
才是正确的方法,我不知道。2izufjch3#
从你给出的注解来看,
'String'
只是一个例子,而不是你传递给const_get
的值。实际的值显然是'Assign',这对吗?当您执行
Object.const_get('Assignment')
并收到uninitialized constant
错误时,它表示此时类Assignment
尚未加载。当你使用
Rails
时,如果文件在正确的文件夹中,并且类遵循命名约定,那么会发生很多自动加载。因为你正在运行一个“独立的”ruby脚本,所以不会发生自动加载,你需要自己加载文件。添加一行,如
require_relative "somepath/assignment"
somepath
需要适应您的目录/文件布局。它将加载文件并执行该文件中的ruby代码。如果assignment.rb
定义了类似于那么
const_get
就可以工作了。话虽这么说:你的具体用例是什么?2为什么你需要动态地查找类?3另外请注意,如果你让用户输入定义加载什么类,这会给你的应用程序带来(一个不太可能的)潜在的安全问题。