2015-05-15 1 views
0

Я ищу, чтобы проверить variabe для его типа на основе значения, хранящегося в другой переменной, но я борюсь с ним. Я совершенно новичок в рубине, но может ли кто-нибудь сказать мне, как иметь значение переменной, интерпретируемой в выражении? Мой текущий код выглядит следующим образом: -Руби интерпретируемые переменные is_a?

if variable.is_a?("#{variable_type}") 
    puts variable 
end 

Где variable может содержать ничего и variable_type содержит тип переменной, как строка или Fixnum. Но в настоящее время этот код дает мне TypeError: Class or module required. Любые мысли?

+0

Если вы используете Rails, а не 'Object.const_get (variable_type)' вы можете просто использовать 'variable_type.constantize', чтобы получить класс из строки , –

ответ

2

Ваш код отправляет объект типа String методу #is_a? и метод #is_a ожидает класса.

Например, String против "String":

variable = "Hello!" 
variable_type = String 
"#{variable_type}" # => "String" 

# your code: 
if variable.is_a?("#{variable_type}") 
    puts variable 
end 

#is_a? ожидает фактического класса (String, Fixnum и т.д. ') - как вы можете видеть в the documentation for #is_a?.

Вы можете настроить свой код двумя способами:

  1. пройти класс, без строки.

  2. преобразовать строку в класс, используя Module.const_get.

вот пример:

variable = "Hello!" 
variable_type = String 
"#{variable_type}" # => "String" 

# passing the actual class: 
if variable.is_a?(variable_type) 
    puts variable 
end 

# or, 

# converting the string to a the type: 
if variable.is_a?(Module.const_get(variable_type.to_s)) 
    puts variable 
end 
+0

Спасибо. Это работает. –

+0

Мое удовольствие, удачи! – Myst

+0

Как правило, не рекомендуется использовать '' # {var} "', когда вы можете просто использовать 'var' или' var.to_s'. –

2

Просто небольшой пример:

variable = 1 

variable_type = String 
puts variable if variable.is_a?(variable_type) 
#=> nil 

variable_type = Integer 
puts variable if variable.is_a?(variable_type) 
#=> 1 

Или когда ваш variable_type является строкой:

variable_type = 'Integer' 
puts variable if variable.is_a?(Object.const_get(variable_type)) 
#=> 1 
+0

Спасибо, ты помог мне понять больше, что моя проблема, это имеет смысл, но что, если variable_type = "String", а не String? –

+0

@JjNo он вернет ту же ошибку, поскольку это будет строка, а не имя класса. –

+1

Чтобы получить класс из строки, используйте 'Object.const_get (« String »)'. –

1

TypeError: Class or module required

Это означает, что для использования is_a?varibale_type должен держать имя класса (Любые).

Поэтому, если вы держите что-нибудь еще, кроме имени класса в variable_type, оно даст вам эту ошибку.

a = :a 

variable_type = Symbol 
a if a.is_a? variable_type 
# => :a 

Если тип переменной является строкой, то вам придется использовать Module#const_get:

variable_type = 'Symbol' 
a if a.is_a? Object.const_get(variable_type) 
# => :a 
+0

Спасибо. Поэтому я предполагаю, что мой следующий вопрос будет предполагать, что у меня есть строка в 'variable_type', как я могу преобразовать это в имя класса? –

+0

Большое спасибо @AndreyDeineko –

Смежные вопросы