Ruby 类eval块内的正则表达式错误

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? || \

我有一些代码可以从简单的定义中向模块添加方法,用于通过REST客户机周围的包装器类与远程资源通信

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}”的事情让它们逃脱。