Классифицировать строку 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"