5

我和Range一起玩Elixir
它工作正常:

>1..10 |> Enum.map fn(x) -> x |> IO.puts end
>1
>..
>10
>[:ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok]

但是这里有错误:

>'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

我来自Ruby熟悉Erlang
我想了解什么问题?
谢谢!!!

4

3 回答 3

12

提供的答案不再适用于 elixir 1.4.1,因为 String.from_char_list/1 已被弃用。您现在可以生成这样的字符列表:

?a..?z
|> Enum.to_list
|> List.to_string
于 2017-02-24T18:57:29.007 回答
6

关于第一个,我认为 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

关于第二个,一个选项可能如下所示(尽管可能有更好的方法)。

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

[2.3 字符串(二进制)和字符列表(lists)] 下面涵盖了一些字符列表(?a等) http://elixir-lang.org/getting-started/binaries-strings-and-char -lists.html

于 2013-12-22T23:42:49.230 回答
5

我非常喜欢使用以下语法来生成字符列表,因为它清楚地明确需要返回字符的 UTF-8 二进制表示,而不是其代码点:

iex(1)> Enum.map(?a..?z, fn(x) -> <<x :: utf8>> end)
["a", "b", "c", ..., "z"]

或者,它的for理解语法:

iex(1)> for x <- ?a..?z, do: <<x :: utf8>>
["a", "b", "c", ..., "z"]

因此,在您的具体情况下:

iex(1)> Enum.map(?a..?z, fn(x) -> <<x :: utf8>> |> IO.puts() end)
a
b
c
# ...
z
[:ok, :ok, :ok, ..., :ok]
于 2017-07-12T02:06:30.600 回答