我和Range一起玩Elixir.
它工作正常:
>1..10 |> Enum.map fn(x) -> x |> IO.puts end
>1
>..
>10
>[:ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok]
Run Code Online (Sandbox Code Playgroud)
但这里有错误:
>'a'..'z' |> Enum.map fn(x) -> x |> IO.puts end
** (Protocol.UndefinedError) protocol Range.Iterator not implemented for 'a'
/Users/elix_lang/lib/elixir/lib/range.ex:7: Range.Iterator.impl_for!/1
Run Code Online (Sandbox Code Playgroud)
我来自Ruby熟悉,Erlang
我想了解问题是什么?
谢谢!!!
Chi*_*ean 10
提供的答案不再适用于elixir 1.4.1,因为不推荐使用String.from_char_list/1.您现在可以生成如下字符列表:
?a..?z
|> Enum.to_list
|> List.to_string
Run Code Online (Sandbox Code Playgroud)
关于第一个,我认为如果你只想迭代范围,可以使用Enum.each.
iex(1)> 1..10 |> Enum.each fn(x) -> IO.puts(x) end
iex(2)> 1..10 |> Enum.each &IO.puts(&1)
1
2
...
:ok
Run Code Online (Sandbox Code Playgroud)
关于第二个选项,一个选项可能如下(尽管可能有更好的方法).
iex(3)> ?a..?z |> Enum.each &IO.puts(String.from_char_list!([&1]))
a
b
...
:ok
iex(4)> ?a..?z |> Enum.map(&String.from_char_list!([&1])) |> IO.puts
abcdefghijklmnopqrstuvwxyz
:ok
Run Code Online (Sandbox Code Playgroud)
[2.3字符串(二进制)和字符列表(列表)]在下面介绍了一些字符列表(?a等) http://elixir-lang.org/getting-started/binaries-strings-andchar -lists.html
我非常喜欢使用以下语法来生成字符列表,因为它明确地明确希望返回字符的 UTF-8 二进制表示形式,而不是其代码点:
iex(1)> Enum.map(?a..?z, fn(x) -> <<x :: utf8>> end)
["a", "b", "c", ..., "z"]
Run Code Online (Sandbox Code Playgroud)
或者,它的for理解语法:
iex(1)> for x <- ?a..?z, do: <<x :: utf8>>
["a", "b", "c", ..., "z"]
Run Code Online (Sandbox Code Playgroud)
因此,根据您的具体情况:
iex(1)> Enum.map(?a..?z, fn(x) -> <<x :: utf8>> |> IO.puts() end)
a
b
c
# ...
z
[:ok, :ok, :ok, ..., :ok]
Run Code Online (Sandbox Code Playgroud)