长生不老药字符范围

问题描述:

我玩范围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
我想明白了什么问题?
谢谢!

关于第一个,我认为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字符串(二进制)和焦炭名单(名单)]下面介绍了一些炭列表(?一,等等) http://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html

+0

谢谢我必须更加细心 –

+0

谢谢!我不知道'?a'语法。这很方便。 – amorphid

所提供的答案不再是灵丹妙药工作1.4.1因为String.from_char_list/1已被弃用。现在,您可以像这样的字符列表:

?a..?z 
|> Enum.to_list 
|> List.to_string 
+0

由于'?a'为97,'?z'为122,这个代码只是创建了范围'97..122',后来通过'to_list'整数列表,整数列表在beam平台上被观察为字符列表。 然后可以使用该列表上的模式匹配或通过递归遍历它。真正的糖果。 :) – Daniel

我很喜欢使用下面的语法生成字符列表由于其对专门希望字符的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]