【问题标题】:Ruby interpreted variables is_a?Ruby 解释变量 is_a?
【发布时间】:2015-05-15 12:53:59
【问题描述】:

我希望根据另一个变量中保存的值检查变量的类型,但我正在努力解决它。我对 ruby​​ 完全陌生,但谁能告诉我如何在表达式中解释变量的值?我当前的代码如下:-

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

其中variable 可以包含任何内容,而variable_type 包含变量的类型,例如String 或Fixnum。但目前这段代码给了我TypeError: Class or module required. 任何想法?

【问题讨论】:

  • 如果您使用的是 Rails,而不是 Object.const_get(variable_type),您可以使用 variable_type.constantize 从字符串中获取类。

标签: ruby variable-types


【解决方案1】:

您的代码向#is_a? 方法发送一个String 对象,而#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? 需要实际的类(字符串、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

【讨论】:

  • 一般不建议使用"#{var}",可以使用varvar.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

【讨论】:

  • 谢谢,你帮助我更多地理解了我的问题,这是有道理的,但是如果 variable_type = "String" 而不是 String 呢?
  • @JjNo 它会返回同样的错误,因为它是一个字符串,而不是一个类名
  • 要从字符串中获取类,请使用Object.const_get("String")
【解决方案3】:

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

【讨论】:

  • 谢谢。所以我想我的下一个问题是假设我在variable_type 中确实有一个字符串,如何将其转换为类名?
猜你喜欢
  • 2014-04-04
  • 2011-05-16
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多