gpt4 book ai didi

elixir - 用 "with"语句重构 case 语句

转载 作者:行者123 更新时间:2023-12-01 09:14:39 25 4
gpt4 key购买 nike

我有一个三重嵌套到 case 语句。在这个 Controller Action 中发生了完全令人厌恶的事情。

但是,我很高兴我处于这种情况,因为 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)

我的建议是在单独的私有(private)函数中提取评估以提高可读性。

关于elixir - 用 "with"语句重构 case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818582/

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