Классифицировать строку Ruby

У меня есть программа, которая создает классы, которые выглядят следующим образом:

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

Но я бы хотел назвать динамически MyClass из строки. И поскольку это для имени класса, я хотел бы классифицировать эту строку, например (спасибо Rails-методам):

  "hello_world".classify # => "HelloWorld"

Я не знаю, есть ли в чистом Ruby метод для этого.

Спасибо

Ответ 1

Не уверен, что ваш вопрос связан только с построением верблюжьей строки, а также с присвоением ему вновь созданного класса. Потому что для последнего вы должны использовать метод 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"

Ответ 2

Нет, нет. Здесь ссылка на строку.

Вы можете сделать это следующим образом:

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

Вы можете легко реализовать это, переклассифицировав класс String.

Однако, если вы используете Rails по какой-либо причине, classify добавляется для удобства вместе с методом underscore. Я считаю, что он все еще используется в Rails 3.

Ответ 3

Если вы хотите просто получить доступ к классу из имени строки и не определять его из строки, вы также можете использовать это:

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

Ответ 4

Это намного позже, но я перехожу к этому процессу и расширяюсь на ответ 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"