如何防止作为字符返回的数字?

时间:2016-06-13 10:56:19

标签: elixir

我正在编写来自Programming Elixir(PragProg)的示例问题。问题是编写一个函数,将数字from返回到to。我的解决方案如下。但是,有时它们会返回字符(相当于它们的ascii)。如何避免这种情况并仅返回数字。

defmodule MyList do
  def span(), do: []
  def span(from), do: [from]
  def span(from, to) when from == to, do: [from]
  def span(from, to) when from > to, do: [from] ++ span(from - 1, to)
  def span(from, to) when from < to, do: [from] ++ span(from + 1, to)
end

MyList.span(31,34) #=> [31,32,33,34]
MyList.span(-5,-8) #=> [-5,-6,-7,-8]
MyList.span(65,68) #=> 'ABCD'  (I need a list with numbers 65 to 68)

1 个答案:

答案 0 :(得分:2)

你无法阻止,因为Elixir和Erlang没有用户定义的类型,所以没有办法区分列表和单个带引号的字符串,因为两者都只是列表。你真的应该没有太大的问题。

如果它打印,那么你可以做这样的事情

IO.inspect [65, 66, 67, 68], char_lists: false#[65, 66, 67, 68]

有关原因的详细解释,请转到此帖子 - https://stackoverflow.com/a/30039460/3480449

要在您的模块中添加它,打印结果,您需要其他方法,并将其他方法设为私有

defmodule MyList do
  def span(), do: IO.inspect [], char_lists: false
  def span(from), do: IO.inspect [from], char_lists: false 
  def span(from, to), do: IO.inspect span_h(from, to), char_lists: false

  defp span_h(from, to) when from == to, do: [from]
  defp span_h(from, to) when from > to, do: [from] ++ span(from - 1, to)
  defp span_h(from, to) when from < to, do: [from] ++ span(from + 1, to)
end