Elixir中递归与变量的工作机制及赋值异常问题解析
Elixir递归函数返回旧值的问题解答
我是Elixir完全新手,尝试通过编写如下递归函数练习递归:
def player_choice() do choice = IO.gets("Choose rock, paper or scissors: ") |> String.trim() unless String.downcase(choice) in ["rock", "paper", "scissors"] do IO.puts("\nPlease insert a valid move") choice = player_choice() end choice end
该函数本应在输入无效值时持续请求输入,但当首次输入“no”这类无效值、后续输入“rock”这类有效值时,函数却返回“no”,为何变量未被正确重新赋值?
问题核心:Elixir的变量不可变性
Elixir是函数式语言,变量一旦赋值就不可修改。你在unless块里写的choice = player_choice(),并没有覆盖外层的choice变量,只是在unless的局部作用域里新建了一个同名变量——这个局部变量只在块内有效,外层的choice还是最初输入的"no",所以函数最后返回的是外层的旧值。
修复方案:直接返回递归结果
函数式编程里不需要“重新赋值”,而是通过返回不同分支的结果来实现逻辑。修改后的代码如下:
def player_choice() do choice = IO.gets("Choose rock, paper or scissors: ") |> String.trim() if String.downcase(choice) in ["rock", "paper", "scissors"] do choice else IO.puts("\nPlease insert a valid move") player_choice() end end
或者用unless调整逻辑:
def player_choice() do choice = IO.gets("Choose rock, paper or scissors: ") |> String.trim() unless String.downcase(choice) in ["rock", "paper", "scissors"] do IO.puts("\nPlease insert a valid move") player_choice() else choice end end
当输入无效时,函数直接返回递归调用player_choice()的结果(也就是最终输入的有效值);输入有效时返回当前的choice。这样就避开了变量赋值的坑,完全符合Elixir的函数式编程逻辑。
内容的提问来源于stack exchange,提问作者Psychicplatypus
相关产品推荐
相关产品推荐

