我有一个三重嵌套的case语句。在此控制器操作中,这是完全可憎的事情。
但是,我很高兴自己处在这种情况下,因为IMO最好的学习方法之一就是看到代码以许多不同的方式做同样的事情。这使我想到了这个问题。
如何重构这部分代码以使用with
语句代替case
?我在网上找到的所有示例都比这个示例更为琐碎。
case Nba.get_todays_games do
{:ok, games} ->
game_id = Map.get(games, "games")
|> Enum.random
|> Map.get("id")
:timer.sleep(1000)
case Nba.get_game_summary(game_id) do
{:ok, game} ->
team_id = Map.take(game, ["away", "home"])
|> Enum.random
|> elem(1)
|> Map.get("id")
:timer.sleep(1000)
case Nba.get_team_roster(team_id) do
{:ok, team} ->
player_id = Map.get(team, "players")
|> Enum.random
|> Map.get("id")
player_name = Map.get(team, "players")
|> Enum.find(fn %{"id" => id} -> player_id == id end)
|> Map.get("full_name")
end
end
end
我注意到我根本无法像这样重构:
with {:ok, games} <- Nba.get_todays_games,
{:ok, game} <- Nba.get_todays_games(game_id),
{:ok, team} <- Nba.get_team_roster(team_id)
我显然需要做之间的逻辑才能获得game_id和team_id。谢谢您的帮助!
只需在with
子句中插入需要评估的内容,就可以完成所有工作:
with {:ok, games} <- Nba.get_todays_games,
game_id <- evaluate_game_id(),
{:ok, game} <- Nba.get_todays_games(game_id),
team_id <- evaluate_team_id(),
{:ok, team} <- Nba.get_team_roster(team_id)
我的建议是在单独的私有函数中提取评估结果,以提高可读性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句