Классифицировать строку Ruby - PullRequest
2 голосов
/ 01 ноября 2010

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

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

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

  "hello_world".classify # => "HelloWorld"

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

Спасибо

Ответы [ 4 ]

5 голосов
/ 01 ноября 2010

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

Нет, нет.Вот справочная страница String .

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

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

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

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

0 голосов
/ 04 мая 2016

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

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

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