我正在尝试在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'
有什么想法或想法吗?
答案 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