我正在尝试使用元编程来构建一个通用方法,其中它使用method
s 来array
操作send
对象splat
,以下是工作片段:
ALLOWED_DATA_TYPES = {
'Integer' => [['to_i']],
'Csv' => [['split', ',']]
}
ALLOWED_DATA_TYPES.each do |type, methods|
define_method("#{type.downcase}_ified_value") do
manipulated_value = value
methods.each { |method| manipulated_value = manipulated_value.public_send(*method) }
return manipulated_value
end
end
到目前为止它工作得很好,直到我们决定添加另一个数据类型并且它需要调用方法 on array
,例如
"1,2,3".split(',').map(&:to_f)
现在我被卡住了,因为它是一个障碍。从技术上讲,以下代码工作正常:
"1,2,3".public_send('split', ',').public_send(:map, &:to_f)
# => [1.0, 2.0, 3.0]
但是将其添加block
到数组中会引发错误
[['split', ','], ['map', &:to_f]]
# => SyntaxError: syntax error, unexpected &, expecting ']'
我知道我可以创建一个proc
并用 amp 调用它,&
但我希望你明白它正在失去一致性,我需要一些可以与splat
操作员一起使用的东西,如使用定义的那样#define_method
我现在没有想法,请帮助。