2014-11-03 61 views
0

我有一个服务类,有助于消毒来自JSON有效负载的数据。红宝石发送使用splat不按预期方式工作

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 

问题是,当我调用类的方法,它返回一个枚举:

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

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

不是评估方法和返回的:

=> "234" 

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

回答

1

,可以储存的ARGS为一个数组,并在最后时刻使用图示:

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 
+0

非常好!谢谢。假设调用splat实际上会做一些事情来分解数组? – Jay 2014-11-03 18:13:53

+0

我会说splat将一个参数列表转换为一个数组或一个数组到一个参数列表中。 – ThomasSevestre 2014-11-03 18:22:47

1

要存储的ARGS为一个数组,所以当你调用该方法,则需要再次啪它:

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

这:

@args = *method_args 

的图示无助于你,所以你可以只是:

@args = method_args