我在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