2010-11-01 56 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"