Ruby使用splat发送不按预期工作

时间:2014-11-03 17:56:36

标签: ruby methods arguments send splat

我有一个服务类,可以帮助清理JSON有效负载中的数据。

  attr_reader :data, :method, :args

  def self.call(*args)
    new(*args).call
  end

  def initialize(data, sanitization_method, *method_args)
    @data = data
    @method = sanitization_method
    @args = *method_args
  end

  def call
    data.send(method, args)
  end

问题是当我调用类方法时,它返回一个Enumerator:

PaidGigs::Services::SanitizeData.call("shd234", :gsub, /[^0-9]/, "")

=>  #<Enumerator: "shd234":gsub([/[^0-9]/, ""])>

而不是评估方法并返回:

=> "234"

我在控制台中玩过,这是因为splat数组没有被转换为单独的参数,这与Ruby文档的建议相反。 Object#send有没有人遇到过这个问题?任何帮助非常感谢!

2 个答案:

答案 0 :(得分:1)

您应该将args存储为数组,并在最后一刻使用splat:

class SanitizeData
  attr_reader :data, :method, :args

  def self.call(*args)
    new(*args).call
  end

  def initialize(data, sanitization_method, *method_args)
    @data = data
    @method = sanitization_method
    @args = method_args
  end

  def call
    data.send(method, *args)
  end
end

puts SanitizeData.call("shd234", :gsub, /[^0-9]/, "").inspect

答案 1 :(得分:1)

您将args存储为数组,因此当您调用该方法时,需要再次将其展开:

def call
  data.send(method, *args)
end

而且:

@args = *method_args

splat对你没有任何帮助,所以它可以是:

@args = method_args