我认为这很简单,但是当我遇到这种情况时,我无法做到这一点。我觉得如果我能理解这一点,我会更好地理解Ruby。
WHAT :我想在2-d字符串和整数数组中搜索,并返回找到某个字符串的索引/索引。每个子阵列的这些索引也将按照相应子阵列的顺序放在一个数组中。
搜索字符串" a":
时的示例输入数组: [[1," a"," a",3],[1,&# 34; b"],["",2]]
输出数组: [[1,2],[],[0]]
我做了什么: 直觉上我认为它会是这样的:
source = [[1,"a","a",3],[1,"b"],["a",2]]
与
source.each.each_index.select { |v| v == "a" }
或
source.each {|x| x.each_index.select { |i| x[i] == "a" }}
问题:
1)我应该调用什么来从输入数组中获取输出数组?
2)我看到很多其他的调查员和方法以这种方式混合在一起,为什么我不能在这种情况下做到这一点?我不想用我尝试的一些更简单的测试用例来混淆这个问题,但是我得到了未定义的方法错误,或者只是返回我的源数组。
3)是否与哪些块与哪些方法相关?我在问题的答案之后对我的代码进行了建模:Find indices of elements that match a given condition我很困惑为什么看起来这个块直接与多个方法相关联。换句话说,| i |来自#each_index,而布尔值是#select。现在似乎是随机和杂乱的,如何构造这些块(即为什么反之亦然?)。
答案 0 :(得分:1)
source.map { |row| row.each_index.select { |i| row[i] == "a" } }
# => [[1, 2], [], [0]]
你不能这样做,因为你的逻辑错了:) source.each {...}
会返回source
,无论你在街区内做什么都没关系。要返回结果,请使用map
。 source.each.each_index
在each_index
返回的枚举器上调用each
而没有阻止,这不是枚举器上可用的方法(您希望数组上有each_index
)。
事实上。带有阻止的each
和没有阻止的each
将会做很多不同的事情。
具体来说,在我上面的代码中:
从source
数组开始。 map
with block将处理每个元素的块(称为row
),并返回结果数组。对于每一行,row.each_index
没有块将返回row
数组的所有索引的迭代器,select
在迭代器上使用块将返回一个仅包含其中一些元素的数组。