我是 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”。為什么會發生這種情況,“選擇”不應該是重新分配的值嗎?
uj5u.com熱心網友回復:
問題是您choice
在 internal 中重新定義了一個新變數unless
,掩蓋了外部變數(在 Elixir 中,您不會“重新分配”)。編譯器會警告您:
變數“choice”未使用(背景關系中存在同名變數
更好的解決方案是:
def player_choice() do
choice = IO.gets("Choose rock, paper or scissors: ") |> String.trim() |> String.downcase
if choice in ["rock", "paper", "scissors"] do
choice
else
IO.puts("\nPlease insert a valid move")
player_choice()
end
end
uj5u.com熱心網友回復:
模式匹配似乎是解決這個問題的慣用方式
defmodule Playground do
def player_choice(choice) when choice in ["rock", "paper", "scissors"], do: choice
def player_choice(_) do
IO.puts("\nPlease insert a valid move")
prompt()
end
def prompt() do
IO.gets("Choose rock, paper or scissors: ")
|> String.trim()
|> String.downcase
|> Playground.player_choice
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/506968.html
上一篇:在資料中創建平均變數-新列
下一篇:無法從函式內部回傳變數