Как получить класс из строки? - PullRequest
0 голосов
/ 05 января 2012

Я бы хотел проиндексировать хеш с помощью класса (не символа!), Как показано ниже:

irb(main):015:0> class Key ;end
=> nil
irb(main):016:0> h={Key => "ok"}
=> {Key=>"ok"}

Хорошо.Затем, учитывая имя класса в виде строки, я хочу получить элемент:

irb(main):017:0> str="Key"
=> "Key"
irb(main):018:0> h[str]
=> nil

Но (как показано выше) это не получается (конечно).

Так что мойвопрос: как я могу преобразовать строку в фактический класс?

Ответы [ 4 ]

6 голосов
/ 05 января 2012

Если вы используете Rails, вы обнаружите, что ActiveSupport «константирует» делать то, что вы хотите.

"String".constantize
=> String

Но вы можете сделать что-то подобное.

Object.const_get("String")
=> String

Вы даже можете определить это в строке

class String
  def constantize
    Object.const_get(self)
  end
end

примечание: старайтесь избегать "eval", если вам это действительно не нужно.

3 голосов
/ 05 января 2012

Вы можете использовать Kernel#const_get:

str = "Key"
k = Kernel.const_get(str)
val = h[k]
0 голосов
/ 05 января 2012

Вы можете сделать это так (вы, вероятно, не хотите использовать eval):

>> class Key ;end #=> nil
>> h={Key => "ok"} #=> {Key=>"ok"}
>> str="Key" #=> "Key"
>> h[Kernel.const_get(str)] #=> "ok"
0 голосов
/ 05 января 2012

вы можете использовать h[eval(str)]. Более подробная информация о eval в документах Ruby 1.9.3

Я должен добавить, что это острый нож, не режьте себя этой техникой. Вы хотите убедиться, что строка, которую вы выводите, не может содержать вредоносный код.

...