将字符串转换为Ruby中的类名

8hhllhi2  于 2022-11-04  发布在  Ruby
关注(0)|答案(3)|浏览(212)

我正在尝试用ruby编写一个脚本,其中涉及到将字符串转换为类名。由于我使用的是纯ruby,所以不能使用.constantize。我尝试使用Object.const_get('String'),但不确定为什么它会抛出uninitialized constant String (NameError)
文件顶部有require 'active_support'

hmmo2u0o

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。

watbbzwu

watbbzwu2#

您是否尝试将const_get仅用于类,或者它位于类似ModuleA::ModuleB::ClassName的命名空间下?
是否也将字符串转换为类名以生成新类或为其赋值?
我问这些问题是因为答案会影响你要用的方法,也许const_set而不是const_get才是正确的方法,我不知道。

2izufjch

2izufjch3#

从你给出的注解来看,'String'只是一个例子,而不是你传递给const_get的值。实际的值显然是'Assign',这对吗?
当您执行Object.const_get('Assignment')并收到uninitialized constant错误时,它表示此时类Assignment尚未加载。
当你使用Rails时,如果文件在正确的文件夹中,并且类遵循命名约定,那么会发生很多自动加载。因为你正在运行一个“独立的”ruby脚本,所以不会发生自动加载,你需要自己加载文件。
添加一行,如
require_relative "somepath/assignment"
somepath需要适应您的目录/文件布局。它将加载文件并执行该文件中的ruby代码。如果assignment.rb定义了类似于

class Assignment
end

那么const_get就可以工作了。
话虽这么说:你的具体用例是什么?2为什么你需要动态地查找类?3另外请注意,如果你让用户输入定义加载什么类,这会给你的应用程序带来(一个不太可能的)潜在的安全问题。

相关问题