Ruby:获取变量的名称

时间:2015-07-21 13:27:21

标签: ruby-on-rails ruby types

我正在尝试在Ruby中创建一个类来检查类型并在发现错误时引发错误。这是我到目前为止所得到的:

module LibHelper
  class Base
    def self.check_type(variables, types)
      raise "Expected variables to be an array" unless variables.is_a?(Array)
      raise "Expected types to be an array" unless types.is_a?(Array)
      raise "Variable array and type array aren't same length" unless variables.length == types.length
      variables.zip(types).each do |variable, type|
        raise "Expected parameters in variables array to be symbols" unless variable.is_a?(Symbol)
        raise "Expected #{eval(variable.to_s, binding)} to be type: #{type}" unless variable.is_a?(type)
      end
    end

    def self.valid_type?(type)
      valid_types = [String, Fixnum, NilClass, Hash, Symbol]
      raise "Expected type to be String, Fixnum, NilClass, Hash, or Symbol got #{type}" unless valid_types.include?(type)
    end
  end
end

test_var = 'just_a_test_string'
LibHelper::Base.check_type([test_var], [String])

我的问题是返回非特定类型变量名称的最佳方法是什么?我想在这一行中这样做:

raise "Expected #{eval(variable.to_s, binding)} to be type: #{type}" unless variable.is_a?(type)

但似乎绑定可能不会在范围内传递?理想情况下,我的返回值是'预期test_var为type:String'

有什么想法或想法吗?

1 个答案:

答案 0 :(得分:3)

它无法正常工作。

没有可靠的方法来检索对象所分配的变量名称。这是一个人为的例子:

def check_string(foo)
  bar = foo
  LibHelper::Base.check_type([bar], [String])
end

var = 123
check(var)

在这种情况下,正确的错误消息是什么?

#=> Expected var to be type: String
#=> Expected foo to be type: String
#=> Expected bar to be type: String

此外,您可以轻松创建未分配给变量的对象:

LibHelper::Base.check_type([123], [String])

更好的错误信息是:

#=> Expected 123 to be type: String

即。只需使用variable.inspect