【问题标题】:Strange behavior with String.to_integer/1String.to_integer/1 的奇怪行为
【发布时间】:2015-11-25 01:12:11
【问题描述】:

String.to_integer 在 Elixir 中有一些奇怪的东西。没什么大不了的,但我想知道是否有办法将我的所有功能与管道运算符链接起来。

这就是问题所在。这行代码(可以在“iex”中试试):

[5, 6, 7, 3] 
|> Enum.reverse 
|> Enum.map_join "", &(Integer.to_string(&1))

返回字符串"3765"

我想要的是一个整数。所以我只需要在前一个语句的末尾添加这段代码|> String.to_integer,我应该有一个整数。我们试试吧。这段代码:

[5, 6, 7, 3] 
|> Enum.reverse 
|> Enum.map_join "", &(Integer.to_string(&1)) 
|> String.to_integer

给我这个:"3765"。不是整数,是字符串!

如果我这样做:

a = [5, 6, 7, 3] 
|> Enum.reverse 
|> Enum.map_join "", &(Integer.to_string(&1)) 
String.to_integer(a)

它返回一个整数:3765

这就是我现在正在做的事情,但这让我很生气,因为我很想用出色的管道操作员将所有这些功能链接起来。

感谢您的帮助或灯光。 Elixir 很好玩!

【问题讨论】:

    标签: elixir


    【解决方案1】:

    您需要在map_join 的参数周围添加括号。目前,您的代码被解释为

    [5, 6, 7, 3] 
    |> Enum.reverse 
    |> Enum.map_join("", &(Integer.to_string(&1) |> String.to_integer))
    

    你想要的是什么

    [5, 6, 7, 3] 
    |> Enum.reverse 
    |> Enum.map_join("", &(Integer.to_string(&1)))
    |> String.to_integer
    

    通常,当您在管道中使用捕获时,您总是需要使用括号以避免歧义。捕获也可以简化为&Integer.to_string/1

    [5, 6, 7, 3] 
    |> Enum.reverse 
    |> Enum.map_join("", &Integer.to_string/1)
    |> String.to_integer
    

    但是一个普通的Enum.join 会做同样的事情。如果您查看the implementation,它将使用the String.Chars protocol 将整数转换为字符串。

    [5, 6, 7, 3] 
    |> Enum.reverse 
    |> Enum.join
    |> String.to_integer
    

    顺便说一句,你完全不用字符串也能达到同样的效果:

    [5, 6, 7, 3] 
    |> Enum.reverse 
    |> Enum.reduce(0, &(&2 * 10 + &1))
    

    哦,还有Integer.digitsInteger.undigits,可用于将整数与数字列表相互转换。它在当前版本中不存在,尽管它在 1.1.0-dev 分支中,所以我怀疑它会出现在 1.1.0 中。可以here查看进度。

    [5, 6, 7, 3] 
    |> Enum.reverse 
    |> Integer.undigits
    

    【讨论】:

    • 这就是我通常反对可选括号的原因。在某些情况下,它很好,但我认为通常最好养成始终将括号放在需要的地方的习惯。
    • @Patrick 哦,伙计,这很有帮助。感谢您对括号的解释以及更好更好的替代解决方案。如果你不介意,我会停止它:-)
    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多