我有一個創建類,它看起來像一個程序:分類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