首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用splat发送Ruby不像预期的那样工作

使用splat发送Ruby不像预期的那样工作
EN

Stack Overflow用户
提问于 2014-11-03 17:56:35
回答 2查看 492关注 0票数 0

我有一个服务类,它帮助清理来自JSON有效负载的数据。

代码语言:javascript
复制
  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

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

代码语言:javascript
复制
PaidGigs::Services::SanitizeData.call("shd234", :gsub, /[^0-9]/, "")

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

而不是评估方法和返回:

代码语言:javascript
复制
=> "234"

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-03 18:02:04

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-11-03 18:10:21

您将args存储为一个数组,因此当您调用该方法时,您需要再次拆分它:

代码语言:javascript
复制
def call
  data.send(method, *args)
end

这是:

代码语言:javascript
复制
@args = *method_args

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

代码语言:javascript
复制
@args = method_args
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26720069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档