对Ruby字符串进行分类

时间:2010-11-01 18:59:56

标签: ruby string metaprogramming

我有一个程序可以创建类似于以下的类:

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

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

  "hello_world".classify # => "HelloWorld"

我不知道在纯Ruby中是否有一种方法。

谢谢

4 个答案:

答案 0 :(得分:5)

不确定您的问题是关于构建camelcased字符串,还是关于为其分配新创建的类。因为,对于后者,您应该使用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"

答案 1 :(得分:4)

不,没有。这是String reference page

你可以这样做:

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

您可以通过重新分类String类来轻松实现此目的。

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

答案 2 :(得分:0)

如果您只想从字符串名称访问该类,而不是从字符串中定义它,您也可以使用它:

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

答案 3 :(得分:-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"