gpt4 book ai didi

elixir - String.to_integer/1 的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 08:19:30 25 4
gpt4 key购买 nike

我在 Elixir 中使用 String.to_integer 发现了一些奇怪的东西。没什么大不了的,但我想知道是否有一种方法可以将我的所有函数与管道运算符链接起来。

问题就在这里。这行代码(你可以在“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 非常有趣!

最佳答案

您需要在 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

关于elixir - String.to_integer/1 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32303828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com