【问题标题】:How to assign default value to variable if first condition failed?如果第一个条件失败,如何为变量分配默认值?
【发布时间】:2016-02-09 16:59:51
【问题描述】:

我在 Ruby 中有以下表达式:

env = opts.env || "staging"

Elixir 怎么写?

编辑:

Elixir 中的这个表达式不起作用:

case Repo.insert(changeset) do
  {:ok, opts} ->
    env = opts.env || "staging"

错误:

** (KeyError) key :env not found in: %Myapp.App{__meta__: #Ecto.Schema.Metadata<:loaded>

【问题讨论】:

  • 我认为您的错误是告诉您您的选择没有名为 env 的“成员”-关键字 :env 是长生不老药标记该“成员”的方式。您可以使用 IO.inspect opts 进行检查

标签: elixir


【解决方案1】:

完全相同的成语有效(假设“失败”是指 opts.env 为 nil):

iex(1)> nil || "staging"
"staging"
iex(2)> "production" || "staging"
"production"

Elixir 和 Ruby 一样,将 nil 视为假值。

【讨论】:

  • 所以当我尝试使用变更集 ** (KeyError) key :env not found in: %Myapp.App{__meta__: #Ecto.Schema.Metadata&lt;:loaded&gt;... 执行此操作时出现以下错误
  • 它正在工作,我必须将 env 字段添加到架构中。
【解决方案2】:

为了完整起见,这也可以满足您的要求:

e = "production" # Setting this only because I don't have an opts.env in my app.

env = if !e, do: "staging", else: e
#"production"

e = nil

env = if !e, do: "staging", else: e
#"staging"

【讨论】:

    【解决方案3】:

    在 Elixir 中添加有关 structs 的一般信息:

    由于结构不允许访问不存在的键,您将面临KeyError。 尽管结构是建立在地图之上的。通过在结构上使用映射函数,您可以获得不存在的键的预期行为。

    如果没有为结构定义键,Map.get(&lt;struct&gt;, &lt;key&gt;) 将返回 nil:

    # With "opts" being a struct without "env" key
    
    iex> Map.get(opts, :env) || "staging"
    "staging"
    
    # Map.get/3 has the same behavior
    iex> Map.get(opts, :env, "staging")
    "staging"
    

    【讨论】:

      猜你喜欢
      • 2018-11-08
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多