gpt4 book ai didi

ruby-on-rails - Ruby block 作为数组元素用于在 public_send 中展开

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:39 24 4
gpt4 key购买 nike

我正在尝试使用元编程构建一个通用方法,它使用 array 中的操作 method 并使用 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

到目前为止它工作得很好,直到我们决定添加另一个数据类型并且它需要调用 array 上的方法,例如

"1,2,3".split(',').map(&:to_f)

现在我卡住了,因为它是一个 block 。从技术上讲,以下代码工作正常:

"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 & 调用它,但我希望你明白它正在失去一致性,我需要一些可以与之一起使用的东西使用 #define_method

定义的 splat 运算符

我现在没有想法,请帮忙。

最佳答案

你真不走运,& 不是运算符 - 它是一种特殊语法,只允许在函数参数(定义和调用)中使用。一种方法是为 block 保留数组的最后一个元素;但是你总是必须使用它(即使它只是 nil)。

methods.each { |*method, proc| manipulated_value = manipulated_value.public_send(*method, &proc) }

这应该与 [['split', ',', nil], ['map', :to_f]] 一起使用。

题外话,但请注意,可以使用 inject 更简洁地重写这三行:

manipulated_value = value
methods.each { |*method, proc| manipulated_value = manipulated_value.public_send(*method, &proc) }
return manipulated_value

成为

methods.inject(value) { |manipulated_value, (*method, proc)| manipulated_value.public_send(*method, &proc) }

关于ruby-on-rails - Ruby block 作为数组元素用于在 public_send 中展开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57907611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com