【问题标题】:map with two block variables - ruby带有两个块变量的映射 - ruby
【发布时间】:2019-08-02 07:17:34
【问题描述】:

我在 Ruby 中遇到了一个我无法解释的奇怪行为。

如果我们有一个数组数组并想用map 对其进行迭代。我尝试将 map 与两个块变量一起使用,期望第二个是索引,但它取而代之的是内部数组的值。为什么?

persons = [["john", 28], ["mary", 25],["emma", 30]]
persons.map do |param1, param2|
  puts param1
  puts param2
end

输出是

john
28

那么它为什么会使用它应该迭代的迭代器的值呢?

【问题讨论】:

  • 它就是这样工作的。它产生元素并分配对应于数组中每个元素的两个局部变量。如果您需要使用元素索引,请考虑使用with_index
  • a,b =["john", 28] 。现在 b == 28
  • 参考@steenslag 的评论,解释为here
  • 您能否指出您发现map 产生两个值的文档,其中第二个是索引?那是完全错误的,知道你在哪里找到这样的文档会很有趣,这样我们就可以警告未来的程序员它的不准确之处和/或联系负责人并要求他们更正。
  • @Jörg 我没有看到这样的文档,我想我只是假设它是因为 each_with_index 有第二个作为索引。我新的解构任务,但只是忘记了它。这是完全有道理的,但是我认为第二个参数应该是索引

标签: ruby


【解决方案1】:

这就是你要找的东西:

persons.map.with_index do |array, index|
  ...
end

如果您希望索引从 1 而不是 0 开始,您可以传递偏移量: with_index(1)

【讨论】:

    【解决方案2】:

    您正在使用map,但您似乎并不关心结果,因此each 更合适。与在 JavaScript 中您可能希望默认显示索引不同,在 Ruby 中您必须要求它。

    如果您想显示值,您可以这样做:

    persons.each_with_index do |(name, age), index|
      puts '%d. %s (%s)' % [ index + 1, name, age ]
    end
    

    注意使用(name, age) 来解压缩本来可以作为数组接收的一对值。这是因为each-type 方法将数组视为单个对象。在默认情况下,它会为您自动解包。

    如果您想转换这些值,那么您可以使用map

    persons.map.with_index do |(name, age), index|
      '%d. %s (%s)' % [ index + 1, name, age ]
    end
    

    请记住,当使用map 时,您必须将其捕获为变量,将其返回,或者以某种方式使用结果,否则它会被丢弃。

    【讨论】:

    • 感谢您的回答,我知道 map 和 each 之间的区别。我只是很困惑,为什么带有两个块参数的地图会表现得如此。阅读解构它现在很有意义
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2018-06-20
    • 2015-06-01
    • 1970-01-01
    • 2010-09-05
    • 2022-01-18
    相关资源
    最近更新 更多