发送方法:选择何时传递参数

时间:2016-10-31 03:26:05

标签: ruby

假设我有一个接受字符串和选项哈希的方法。选项哈希将方法名称作为键,将布尔值作为值。

some_method("foo", upcase: true, times: 5)

这个方法应该做的是获取字符串,并根据选项哈希对字符串运行某些方法,在这种情况下,它应该使字符串upcase,然后将它加倍5.我们得到FOOFOOFOOFOOFOO作为输出。

我遇到的问题是当我使用send方法时,options哈希中的某些方法需要参数(例如*,而某些方法则不需要(例如' upcase')。

这是我到目前为止所拥有的。

def method(string, options = {})
  options.each do |method_name, arg|
    method_name = :* if method_name == :times
    mod_string = mod_string.send(method_name, arg)
  end
end

我按预期收到错误

  

错误的参数数量(给定1,预期为0)

     

(repl):9:在'upcase'

所以,我的问题是:有没有办法只在有参数时发送参数?

我唯一想到的是使用if语句来检查布尔值

  options.each do |method_name, arg|
    method_name = :* if method_name == :times
    if arg == true
      mod_string = mod_string.send(method_name)
    elsif !(!!arg == arg)
      mod_string = mod_string.send(method_name, arg)
    end
  end

我只是想看看是否有更好的方法。

1 个答案:

答案 0 :(得分:1)

“当方法有一个必需参数时,请将其命名为”:

method = mod_string.method(method_name)
arity = method.arity
case arity
when 1, -1
  method.call(arg)
when 0
  method.call
else
  raise "Method requires #{arity} arguments"
end

一个可能更好的方法是重构你的哈希,并准确地给你想要作为数组传递的参数:

some_method("foo", upcase: [], times: [5])

然后你可以简单地mod_string.send(method_name, *arg)