Ruby 类eval块内的正则表达式错误
我有一些代码可以从简单的定义中向模块添加方法,用于通过REST客户机周围的包装器类与远程资源通信Ruby 类eval块内的正则表达式错误,ruby,regex,class-eval,Ruby,Regex,Class Eval,我有一些代码可以从简单的定义中向模块添加方法,用于通过REST客户机周围的包装器类与远程资源通信 def service_function(function_name, method, uri, parameters) class_eval <<-RUBY def #{function_name}(params) if !(#{function_name}_required_params - params.keys).empty? || \
def service_function(function_name, method, uri, parameters)
class_eval <<-RUBY
def #{function_name}(params)
if !(#{function_name}_required_params - params.keys).empty? || \
!(params.keys - #{function_name}_params).empty?
raise Errors::InvalidParameters.new(service_name, __method__,
params.keys, #{function_name}_params)
end
WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)
end
def #{function_name}_params
#{function_name}_required_params + #{function_name}_optional_params
end
def #{function_name}_required_params
#{parameters}.select { |param,req| req }.keys
end
def #{function_name}_optional_params
#{parameters}.select { |param,req| !req }.keys
end
RUBY
end
令人不快的是:
WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)
删除“#{uri}”参数将修复它,甚至保留在“#{method}”参数中。有人知道为什么会这样吗?我快不知所措了。你有一个
url
,看起来像/something/rt
,在这里看起来像正则表达式:
WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)
您需要转义并引用
{uri}
,使其看起来像herdoc中的字符串,这样class_eval
将看到执行(…,'/something/rt',…)
,并感到高兴。您可能会在#{method}
中遇到类似问题。您有一个url
,看起来像/something/rt
,在这里看起来像正则表达式:
WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)
您需要转义并引用
{uri}
,使其看起来像herdoc中的字符串,这样class_eval
将看到执行(…,'/something/rt',…)
,并感到高兴。您可能会在#{method}
中遇到类似的问题,问题是我还没有传递任何内容,这只是出于需要。当我删除#{uri}时,它工作得非常好。EditNevermind,我发现了一行来自早期测试的代码,该代码在require步骤中执行。我现在觉得有点傻。谢谢你的回复。=)为了子孙后代和谷歌的利益,解决方案是用“{uri}”替换{uri}”。@user1034016:这应该是安全的,但真正的偏执狂会希望确保uri
没有任何双引号,或者做类似“{uri.inspect}”之类的事情让它们转义。问题是我还没有传递任何信息,这正是我们需要的。当我删除#{uri}时,它工作得非常好。EditNevermind,我发现了一行来自早期测试的代码,该代码在require步骤中执行。我现在觉得有点傻。谢谢你的回复。=)为了子孙后代和谷歌的利益,解决方案是用“{uri}”替换{uri}”。@user1034016:这应该是安全的,但真正的偏执狂会希望确保uri
没有任何双引号,或者做一些类似“{uri.inspect}”的事情让它们逃脱。