Ruby 如何通过元编程访问顶级命名空间?
How to access top-level namespace via metaprogramming in Ruby?
我可以访问Ruby中的顶级命名空间,在class名称前加上两个冒号,例如::AmbiguousClass
我如何通过元编程来做到这一点?
我有很多方法(超过 5 个)来验证和 return 给定的 class,所有这些方法都包含这样一行:
player = ::Player.find_by(uuid: input.player_uuid)
我想让它更通用,这样我就可以传入 class 以通过 uuid 查找并将所有这些方法缩减为一个。这是我试过的:
def validate_and_return(model_name)
uuid_attr = "#{model_name}_uuid".to_sym
return unless input.respond_to?(uuid_attr)
klass = ::model_name.to_s.captialize.constantize
instance = klass.find_by(uuid: input.send(uuid_attr))
# validate instance
end
这不起作用 - return 是一个语法错误:
Class: <SyntaxError>
Message: <"/home/dax/programming/xxx/lib/bus/converters/converter.rb:48: syntax error, unexpected tIDENTIFIER, expecting tCONSTANT
您可以使用字符串插值
"::#{model_name}".captialize.constantize
Michael Gorman 关于字符串插值的建议很好,这就是最终的工作:
klass = "::#{model_name.to_s.capitalize}".constantize
我可以访问Ruby中的顶级命名空间,在class名称前加上两个冒号,例如::AmbiguousClass
我如何通过元编程来做到这一点?
我有很多方法(超过 5 个)来验证和 return 给定的 class,所有这些方法都包含这样一行:
player = ::Player.find_by(uuid: input.player_uuid)
我想让它更通用,这样我就可以传入 class 以通过 uuid 查找并将所有这些方法缩减为一个。这是我试过的:
def validate_and_return(model_name)
uuid_attr = "#{model_name}_uuid".to_sym
return unless input.respond_to?(uuid_attr)
klass = ::model_name.to_s.captialize.constantize
instance = klass.find_by(uuid: input.send(uuid_attr))
# validate instance
end
这不起作用 - return 是一个语法错误:
Class: <SyntaxError>
Message: <"/home/dax/programming/xxx/lib/bus/converters/converter.rb:48: syntax error, unexpected tIDENTIFIER, expecting tCONSTANT
您可以使用字符串插值
"::#{model_name}".captialize.constantize
Michael Gorman 关于字符串插值的建议很好,这就是最终的工作:
klass = "::#{model_name.to_s.capitalize}".constantize