2013-12-22 58 views
2

我玩範圍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
我想明白了什麼問題?
謝謝!

回答

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字符串(二進制)和焦炭名單(名單)]下面介紹了一些炭列表(?一,等等) http://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html

+0

謝謝我必須更加細心 –

+0

謝謝!我不知道'?a'語法。這很方便。 – amorphid

7

所提供的答案不再是靈丹妙藥工作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

1

我很喜歡使用下面的語法生成字符列表由於其對專門希望字符的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]