我有一个创建类,它看起来像一个程序:分类Ruby的字符串
MyClass = Class.new do
def initialize; end
# ...
end
但我想的名字动态MyClass的,从一个字符串。而且因为它是一个类的名字,我想这个字符串进行分类,例如(感谢Rails的方法):
"hello_world".classify # => "HelloWorld"
我不知道,如果在纯Ruby有该方法。
谢谢
我有一个创建类,它看起来像一个程序:分类Ruby的字符串
MyClass = Class.new do
def initialize; end
# ...
end
但我想的名字动态MyClass的,从一个字符串。而且因为它是一个类的名字,我想这个字符串进行分类,例如(感谢Rails的方法):
"hello_world".classify # => "HelloWorld"
我不知道,如果在纯Ruby有该方法。
谢谢
不确定您的问题只是关于构建一个camel字符串还是关于分配一个新创建的类。因为,对于后者,你应该使用Module::const_set
方法:
class_name = 'MyClass'
#=> "MyClass"
klass = Class.new do
def foo
"foo"
end
end
#=> #<Class:0xa093a68>
Object.const_set class_name, klass
#=> Module::MyClass
MyClass.new.foo
#=> "foo"
不,没有。这是String reference page。
你可以这样做是这样的:
"hello_world".split('_').collect!{ |w| w.capitalize }.join
你可以很容易地通过reclassing String类实现这一点。
但是,如果您出于某种原因使用Rails,则会添加classify
以方便使用,同时还会使用underscore
方法。我相信它仍然在Rails 3中使用。
好的解决方案。它可以(在核磁共振成像1.8.7及以后)缩短为:'hello_world“.split('_')。collect(&:capitalize).join' – 2010-11-01 23:51:51
啊,太棒了! – mway 2010-11-02 00:34:27
感谢您的方法;我会用这个hehe来提高我的String类 – moshimoshi 2010-11-03 07:35:43
如果你想只从一个字符串名称访问类的,而不是从一个字符串定义它,你也可以使用这个:
MyClass = Class.new do
def test; end
# ...
end
"MyClass".constantize.test # => what you wanted ?
这是晚得多,但我要通过这个过程和mway的回答扩大我使用这个:
class String
def classify
self.split('/').collect do |c|
c.split('_').collect(&:capitalize).join
end.join('::')
end
end
这将允许您的命名空间添加到字符串。所以:
"api/post_comments".classify
=> "Api::PostComments"
这就是我以为他想要的。 – 2010-11-01 23:23:19
谢谢,这就是我想要做的Mladen。也是这个版本,这对我来说是好的:Object :: const_set(class_name.intern,Class :: new {def foo;“foo”; end} – moshimoshi 2010-11-03 07:33:31
我很好奇这会是什么好处?类名称是动态的,你想编写额外的代码来调用新创建的类,并在编写代码时使用一个你不知道的名字......那么你会如何使用这个新类呢? – grail 2017-03-30 08:57:41