我正在尝试使用Elixir解决经典的fizzbuzz问题。我找到了几种不同的方法来解决这个问题,但最好的方法是:
fizzbuzz = fn
(0, 0, _) -> "FizzBuzz"
(0, _, _) -> "Fizz"
(_, 0, _) -> "Buzz"
(_, _, a) -> a
end
fb = fn n -> fizzbuzz.(rem(n, 3), rem(n, 5), n) end
fb.(10)
我现在的问题是我想要调用fb
匿名函数100次。在红宝石中,它看起来像这样:
100.times do |i|
fb.(i)
end
显然,这不起作用,因为你不能在Ruby中调用这样的匿名函数。但我希望你能得到这张照片。我怎样才能在Elixir中实现这一目标?
答案 0 :(得分:10)
(1 .. 100) |> Enum.each(fb)
答案 1 :(得分:3)
如果您只想执行函数n
次而不返回任何结果(例如将其打印到控制台或将其转换为GenServer),则可以使用Enum.each/2
。< / p>
my_fun = fn x -> x * x end
#=> #Function<6.52032458/1 in :erl_eval.expr/5>
(1..100) |> Enum.each(my_fun)
#=> :ok
但如果您需要返回结果,则应使用Enum.map/2
:
(1..100) |> Enum.map(my_fun)
#=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, ...]
您也可以将它们组合在一起:
(1..100) |> Enum.map(my_fun) |> Enum.each(&IO.puts/1)
#=> 1
#=> 4
#=> 9
#=> 16
#=> 25 ...