在Elixir中遍历范围以调用具有这些数字的函数



我在Elixir中有以下代码:

fizzbuzz = fn
0, 0, _ -> "FizzBuzz"
0, _, _ -> "Fizz"
_, 0, _ -> "Buzz"
_, _, c -> c
end
calc_fizzbuzz = fn n -> fizzbuzz.(rem(n, 3), rem(n, 5), n) end
IO.puts calc_fizzbuzz.(10) # Buzz
IO.puts calc_fizzbuzz.(11) # 11
IO.puts calc_fizzbuzz.(12) # Fizz
IO.puts calc_fizzbuzz.(13) # 13
IO.puts calc_fizzbuzz.(14) # 14
IO.puts calc_fizzbuzz.(15) # FizzBuzz
IO.puts calc_fizzbuzz.(16) # 16

我想避免重复自己,所以我试着做一些类似的事情:

(10..16) |> fn(n) -> IO.puts(calc_fizzbuz.(n)) end

但这是行不通的。我怎么能在长生不老药里做到这一点?

不能通过管道连接到匿名函数。此外,您希望逐个管道值,而不是整个范围,因此需要一个迭代器。

使用功能捕获&/1:

Enum.each(10..16, &IO.puts(calc_fizzbuzz.(&1)))

10..16
|> Enum.map(calc_fizzbuzz)
|> Enum.each(&IO.inspect/1)

强制理解版本:

iex> for n <- 10..16, do: calc_fizzbuzz.(n)
["Buzz", 11, "Fizz", 13, 14, "FizzBuzz", 16]

带打印:

iex> (for n <- 10..16, do: calc_fizzbuzz.(n)) |> Enum.each(&IO.puts/1)
Buzz
11
Fizz
13
14
FizzBuzz
16
:ok

最新更新