长生不老药字符范围
问题描述:
我玩范围在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
答
所提供的答案不再是灵丹妙药工作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]
谢谢我必须更加细心 –
谢谢!我不知道'?a'语法。这很方便。 – amorphid