我想用Elixir映射一个数组(n个数组)的每个方块。
使用Ruby,可以使用这一堆代码来完成:
class Object
def deep_map(&block)
block.call(self)
end
end
class Array
def deep_map(&block)
map {|e| e.deep_map(&block) }
end
end
然后,
[
[
[nil, "foo"],
[nil, nil]
],
[
[nil, "bar"],
[nil, "baz"]
]
].deep_map {|el| el.to_s * 2 }
我们怎么能在Elixir做同样的事情?谢谢你的灯!
答案 0 :(得分:2)
我玩了一下,想出了这个:
defmodule DeepMap do
def deep_map(list, fun) when is_list(list) do
Enum.map(list, fn(x) -> deep_map(x, fun) end)
end
def deep_map(not_list, fun) do
fun.(not_list)
end
end
可能有一种方法可以使它对所有嵌套的Enumerable
都通用,而不仅仅是列表......
这是使用时的样子:
iex(3)> c "/tmp/deep_map.ex"
[DeepMap]
iex(4)> deep_list = [
...(4)> [
...(4)> [nil, "foo"],
...(4)> [nil, nil]
...(4)> ],
...(4)> [
...(4)> [nil, "bar"],
...(4)> [nil, "baz"]
...(4)> ]
...(4)> ]
[[[nil, "foo"], [nil, nil]], [[nil, "bar"], [nil, "baz"]]]
iex(6)> DeepMap.deep_map deep_list, fn(x) -> {x,x} end
[[[{nil, nil}, {"foo", "foo"}], [nil: nil, nil: nil]],
[[{nil, nil}, {"bar", "bar"}], [{nil, nil}, {"baz", "baz"}]]]