gpt4 book ai didi

ruby - 鸭子输入字符串、符号和数组的优雅方式?

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:32 25 4
gpt4 key购买 nike

这是针对我无法破坏的现有公共(public) API,但我确实希望对其进行扩展。

目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给 send 时有意义的内容

我想添加发送字符串、符号等列表的功能。我可以只使用 is_a 吗?数组,但还有其他发送列表的方法,这不是很像 ruby​​。

我将调用列表中的 map,所以第一个倾向是使用 respond_to? : map 。但是字符串也会响应 :map,所以这行不通。

最佳答案

如何将它们全部视为数组String 的行为与仅包含 StringArray 相同:

def foo(obj, arg)
[*arg].each { |method| obj.send(method) }
end

[*arg] 技巧之所以有效,是因为 splat 运算符 (*) 将单个元素转换为自身或将 Array 转换为内联其元素列表。

稍后

这基本上只是一个语法优化版本或 Arnaud's answer ,尽管如果您传递包含其他 ArrayArray 会有细微差别。

稍后

foo 的返回值还有一个不同之处。如果您调用 foo(bar, :baz),您可能会惊讶地得到 [baz]。要解决这个问题,您可以添加 Kestrel :

def foo(obj, arg)
returning(arg) do |args|
[*args].each { |method| obj.send(method) }
end
end

它将始终返回传递的 arg。或者您可以执行 returning(obj) 这样您就可以将调用链接到 foo。这取决于您想要什么样的返回值行为。

关于ruby - 鸭子输入字符串、符号和数组的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330464/

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