2013-10-08 164 views
0

我正在使用send方法进行一些元编程,有点不同。到目前为止,我已经取得了成功,因为我的方法send只能带一个参数。将数组拆分成逗号分隔的值列表

实施例:

client是API客户

@command被取作为一个选择一个CLI效用

@verbclient的方法是取为在CLI中的另一种选择上command的方法

def command_keys 
    case @command 
    when "something" 
    self.command_options.slice(:some, :keys) 
    end 
end 

然后我打电话给像这样的API客户端:

client.send(@command).send(@verb, command_keys) 

这工作,因为这些方法都需要Hash作为他们的论点。我遇到的问题是当我需要在command_keys中发送多个参数时。我想知道的是处理返回多个值的command_keys方法的最好方法。例如:

def command_keys 
    case @command 
    when "something" 
    return self.command_options[:some], self.command_options[:keys] 
    end 
end 

在这种情况下,返回command_keys如预期的阵列,但是当我试图通过,在send(@verb, command_options)呼叫时,它并将其作为阵列(这显然是预期的)。因此,简而言之,是否有一些简单的方法可以轻松处理这种情况?

我知道send(@verb, argument1, argument2)会让我得到我想要的结果,但是我希望能够不必为我的脚本提供比它需要更多的实现逻辑,也就是说我希望它能像抽象一样被抽象为可能。

+0

是的,我知道这个帖子的标题很烂,我想不出更好的方式来字呢。 – Eugene

+1

如果你唯一使用'send'的意图是为了元编程,而不是绕过对protected/private方法的访问控制,可以考虑使用['public_send'](http://ruby-doc.org/core-2.0.0/Object)。 html#method-i-public_send)而不是更清楚地表明意图。 –

回答

1

使用图示。您可能需要重新考虑一下代码,但这样的:

client.send(@command).send(@verb, *all_the_args) 
+0

我一半怀疑splat是解决方案,我只是不知道如何从该方法返回的参数列表成为我实际可以溅出的东西 – Eugene

+1

您可以总是从该方法返回一个数组,但它应该实际上工作甚至与非数组值,我相信。 'send(:foo,* [bar])=== send(:foo,* bar)' – numbers1311407

+0

'send(:foo,* [bar])'语法无效,它将元素作为数组发送,而不是它的价值。 'send(:foo,* bar)'语法可以工作,但是它会中断所有'command_keys'返回一个散列的实例,因为它将散列作为一个数组分解为它的键/值对。我试着添加一些逻辑来判断返回的值是否是一个数组,然后在必要时溅射,但是如果不从代码中移除DRYness,它就不会那么喜欢。 – Eugene