如何用最简洁的方式在Ruby中映射哈希?

2026-04-11 15:051阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计622个文字,预计阅读时间需要3分钟。

如何用最简洁的方式在Ruby中映射哈希?

让我们假设需要对Hash的每个元素执行一个简单的任务,例如将值增加1,或将值更改为包含该值的数组。以下是一个例子:

rubyhash={a: 1, b: 2, c: 3}hash=hash.map { |k, v| [k, v + 1] }puts hash

这只是一个小例子,实际上可以执行任何你想要的操作。

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

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

v 1只是一个例子,它可以是任何东西.

有没有更清洁的方法来做到这一点?我真的不喜欢将哈希映射到2个大小的数组的数组,然后记住再次将其转换为哈希.

可能更好的例子:

hash.hash_map{ |v| v+1 }

这样,字符串转换(to_s)之类的东西可能会被简化为

hash.hash_map(&:to_s)

重复说明:
我不是在寻找哈希[…]或.to_h,我在问是否有人知道更紧凑,更清洁的解决方案.

这就是Ruby的集合框架的工作方式. Enumerable中有一个map方法,它不知道任何关于哈希或数组或列表或集合,树或流或其他任何你可能想到的东西.它只知道有一个名为each的方法,每次迭代将产生一个单独的元素.而已.

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

另一种设计方法是集合操作是类型保留的,即映射集合将产生集合等.例如,这就是在Smalltalk中完成的方式.然而,在Smalltalk中,它通过将几乎相同的方法复制和粘贴到每个不同的集合中来实现.即如果你想在Ruby中实现你自己的集合,你只需要实现它们,你就可以免费获得其他所有东西,而在Smalltalk中,你必须分别实现每一个集合方法. (在Ruby中,这将超过40种方法.)

Scala是第一种能够在没有代码重复的情况下为类型保留操作提供集合框架的语言,但直到Scala 2.8(2010年发布)才解决这个问题. (关键是集合构建器的想法.)Ruby的集合库是在1993年设计的,17年前我们已经想出如何在没有代码重复的情况下进行类型保留集合操作.此外,Scala在很大程度上依赖于其复杂的静态类型系统和类型级元编程,以便在编译时找到正确的集合构建器.这不是该方案工作所必需的,但是必须在运行时为每个操作查找构建器可能会产生大量的运行时成本.

你可以做的是添加不属于标准Enumerable协议的新方法,例如类似于Scala的mapValues和mapKeys.

如何用最简洁的方式在Ruby中映射哈希?

本文共计622个文字,预计阅读时间需要3分钟。

如何用最简洁的方式在Ruby中映射哈希?

让我们假设需要对Hash的每个元素执行一个简单的任务,例如将值增加1,或将值更改为包含该值的数组。以下是一个例子:

rubyhash={a: 1, b: 2, c: 3}hash=hash.map { |k, v| [k, v + 1] }puts hash

这只是一个小例子,实际上可以执行任何你想要的操作。

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

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

v 1只是一个例子,它可以是任何东西.

有没有更清洁的方法来做到这一点?我真的不喜欢将哈希映射到2个大小的数组的数组,然后记住再次将其转换为哈希.

可能更好的例子:

hash.hash_map{ |v| v+1 }

这样,字符串转换(to_s)之类的东西可能会被简化为

hash.hash_map(&:to_s)

重复说明:
我不是在寻找哈希[…]或.to_h,我在问是否有人知道更紧凑,更清洁的解决方案.

这就是Ruby的集合框架的工作方式. Enumerable中有一个map方法,它不知道任何关于哈希或数组或列表或集合,树或流或其他任何你可能想到的东西.它只知道有一个名为each的方法,每次迭代将产生一个单独的元素.而已.

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

另一种设计方法是集合操作是类型保留的,即映射集合将产生集合等.例如,这就是在Smalltalk中完成的方式.然而,在Smalltalk中,它通过将几乎相同的方法复制和粘贴到每个不同的集合中来实现.即如果你想在Ruby中实现你自己的集合,你只需要实现它们,你就可以免费获得其他所有东西,而在Smalltalk中,你必须分别实现每一个集合方法. (在Ruby中,这将超过40种方法.)

Scala是第一种能够在没有代码重复的情况下为类型保留操作提供集合框架的语言,但直到Scala 2.8(2010年发布)才解决这个问题. (关键是集合构建器的想法.)Ruby的集合库是在1993年设计的,17年前我们已经想出如何在没有代码重复的情况下进行类型保留集合操作.此外,Scala在很大程度上依赖于其复杂的静态类型系统和类型级元编程,以便在编译时找到正确的集合构建器.这不是该方案工作所必需的,但是必须在运行时为每个操作查找构建器可能会产生大量的运行时成本.

你可以做的是添加不属于标准Enumerable协议的新方法,例如类似于Scala的mapValues和mapKeys.

如何用最简洁的方式在Ruby中映射哈希?