假设我有一个接受字符串和选项哈希的方法。选项哈希将方法名称作为键,将布尔值作为值。
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
我只是想看看是否有更好的方法。
答案 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)
。