2010-11-01 32 views
2

我有一个创建类,它看起来像一个程序:分类Ruby的字符串

MyClass = Class.new do 
    def initialize; end 
    # ... 
    end 

但我想的名字动态MyClass的,从一个字符串。而且因为它是一个类的名字,我想这个字符串进行分类,例如(感谢Rails的方法):

"hello_world".classify # => "HelloWorld" 

我不知道,如果在纯Ruby有该方法。

谢谢

回答

5

不确定您的问题只是关于构建一个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" 
+0

这就是我以为他想要的。 – 2010-11-01 23:23:19

+0

谢谢,这就是我想要做的Mladen。也是这个版本,这对我来说是好的:Object :: const_set(class_name.intern,Class :: new {def foo;“foo”; end} – moshimoshi 2010-11-03 07:33:31

+0

我很好奇这会是什么好处?类名称是动态的,你想编写额外的代码来调用新创建的类,并在编写代码时使用一个你不知道的名字......那么你会如何使用这个新类呢? – grail 2017-03-30 08:57:41

4

不,没有。这是String reference page

你可以这样做是这样的:

"hello_world".split('_').collect!{ |w| w.capitalize }.join 

你可以很容易地通过reclassing String类实现这一点。

但是,如果您出于某种原因使用Rails,则会添加classify以方便使用,同时还会使用underscore方法。我相信它仍然在Rails 3中使用。

+0

好的解决方案。它可以(在核磁共振成像1.8.7及以后)缩短为:'hello_world“.split('_')。collect(&:capitalize).join' – 2010-11-01 23:51:51

+0

啊,太棒了! – mway 2010-11-02 00:34:27

+0

感谢您的方法;我会用这个hehe来提高我的String类 – moshimoshi 2010-11-03 07:35:43

-1

如果你想只从一个字符串名称访问类的,而不是从一个字符串定义它,你也可以使用这个:

MyClass = Class.new do 
    def test; end 
    # ... 
end 
"MyClass".constantize.test # => what you wanted ? 
-1

这是晚得多,但我要通过这个过程和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"