gpt4 book ai didi

ruby - 在 ruby​​ 中映射哈希的更简洁方法

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

假设我需要对 Hash 的每个元素执行一项简单的任务,例如将其值增加 1,或将值更改为包含该值的数组。我一直这样做

hash.map{ |k, v| [k, v+1] }.to_h

v+1 只是一个例子,可以是任何东西。

有没有更简洁的方法来做到这一点?我不太喜欢将 HashMap 到 2 维数组的数组,然后记得再次将其转换为哈希。

可能更好的示例:

hash.hash_map{ |v| v+1 }

这样一些像字符串转换(to_s)可能被简化为

hash.hash_map(&:to_s)

重复说明:我不是在寻找 Hash[...].to_h,我是想问是否有人知道更紧凑、更简洁的解决方案。

最佳答案

这正是 Ruby 集合框架的工作方式。 Enumerable 中有一个 map 方法,它对散列、数组、列表、集合、树、流或任何其他你一无所知可能想出。它只知道有一个名为 each 的方法,每次迭代将 yield 一个 单个元素。就是这样。

请注意,这与 Java 和 .NET 的集合框架的工作方式相同。所有集合操作始终返回相同的类型:在 .NET 中,返回的是 IEnumerable,在 Ruby 中,返回的是 Array

另一种设计方法是集合操作是类型保留的,即映射一个集合将产生一个集合,等等。例如,这就是在 Smalltalk 中完成的方式。然而,在 Smalltalk 中,它是通过将几乎相同的方法复制并粘贴到每个不同的集合中来实现的。 IE。如果你想实现你自己的集合,在 Ruby 中,你只需要实现 each,其他一切都是免费的,而在 Smalltalk 中,你必须单独实现每一个集合方法。 (在 Ruby 中,这将超过 40 个方法。)

Scala 是第一种设法提供具有类型保留操作且无需代码重复的集合框架的语言,但直到 Scala 2.8(2010 年发布)才弄明白这一点。 (关键是集合构建器的想法。)Ruby 的集合库是在 1993 年设计的,比我们弄清楚如何在不重复代码的情况下进行类型保留集合操作早 17 年。此外,Scala 严重依赖其复杂的静态类型系统和类型级元编程来在编译时找到正确的集合构建器。这不是该方案工作所必需的,但必须在运行时为每个操作查找构建器可能会产生高昂的运行时成本。

可以做的是添加不属于标准 Enumerable 协议(protocol)的新方法,例如类似于 Scala 的 mapValuesmapKeys.

关于ruby - 在 ruby​​ 中映射哈希的更简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30889765/

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