【问题标题】:Why is the variable not being rebound in this elixir infinite stream?为什么在这丹药无限流中变量没有反弹?
【发布时间】:2015-09-28 05:34:12
【问题描述】:

我有以下:

counter = 0

try do
  for _ <- Stream.cycle([:ok]) do
    IO.puts "Counter is #{counter}"
    counter = counter + 1
    IO.puts "After counter: #{counter}"

    if counter == 3 do
      throw :halt
    end
  end
catch
  :halt -> IO.puts "Finished processing"
end

根据我的阅读,我认为counter = counter + 1 会重新绑定变量,最终counter == 3 条件将为真。但是,我得到的输出是这样的:

Counter is 0
After counter: 1
Counter is 0
After counter: 1
Counter is 0
...

所以,基本上,计数器会回到初始值。感觉 for 内部的重新绑定就像一个局部变量一样工作,或者掩盖了第一个变量。我怎样才能使值保持不变(如果可能不递归)?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    回答标题问题:它没有被重新绑定,因为 do 块通常*不能更改其范围之外的变量。您的 IO 语句表明它可以更改范围内的变量;但是当 do 块再次运行时,它会在新的范围内再次运行,其中初始值是从原始值设置的。

    回答内心的问题:这取决于您要做什么。您的示例并没有提供太多关于您为什么选择 Stream 模块而不是 Enum 的见解。假设您知道要进行三个迭代,实现目标的一种方法是使用 for 理解:

    for i <- (1..3) do
      IO.inspect i
    end
    

    我可能过度解释了你的问题,我当然不是要侮辱,但你似乎厌恶递归。如果您打算在 Elixir 中编写大量代码,那么您需要克服这些问题 - 这是一种函数式语言,递归是惯用的 - 在任何语言中,使用该语言编写 会更有效率而不是尝试围绕您不熟悉的部分编写代码。

    *有关例外情况,请参阅macro programming

    【讨论】:

    • 感谢您的回答!我对递归没有反感,我只是好奇是否有其他方法可以在满足条件时退出循环,而不必使用递归。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多