class-eval块内的正则表达式错误

时间:2012-07-23 05:38:58

标签: 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? || \
           !(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

在我甚至可以运行代码之前,只需要我正在构建IRB的gem就会吐出这个错误:

1.9.2p320 :001 > require 'web-services'
SyntaxError: (eval):7: unknown regexp options - rt

违规行是:

WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)

删除“#{uri}”参数可以修复它,甚至可以保留“#{method}”参数。有没有人知道为什么会这样?我快要结束了。

1 个答案:

答案 0 :(得分:1)

您的url看起来像/something/rt,在这里看起来像一个正则表达式文字:

WebServices::ServiceRequest.perform(self.domain, #{uri}, #{method}, params)

您需要转义并引用#{uri},使其看起来像是heredoc中的字符串,这样class_eval会看到perform(..., '/something/rt', ...)并感到高兴。您可能会遇到与#{method}类似的问题。