Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药中的字符串比较_Elixir - Fatal编程技术网

Elixir 长生不老药中的字符串比较

Elixir 长生不老药中的字符串比较,elixir,Elixir,我试图比较Elixir中的字符串位-如果它们相等,则if块触发,或者else块触发 def show(conn, %{"id" => id}) do Logger.info id Logger.info "----------" Logger.info conn.assigns.current_user if conn.assigns.current_user == id do professional = Repo.get!(Profess

我试图比较Elixir中的字符串位-如果它们相等,则
if
块触发,或者
else
块触发

def show(conn, %{"id" => id}) do
    Logger.info id
    Logger.info "----------"
    Logger.info conn.assigns.current_user
    if conn.assigns.current_user == id do
        professional = Repo.get!(Professional, id)
        render(conn, "show.html", professional: professional)
    else
      conn
      |> put_flash(:error, "You must be logged in for that!")
      |> redirect(to: site_path(conn, :index))
      |> halt()
    end
在上面的示例中,
Logger.info id
Logger.info conn.assigns.current_user
都返回相同的内容,但从未输入
if


我做错了什么?

我猜你的
连接分配。当前用户是一个数字,
id
是一个字符串
IO.inspect(是二进制的(conn.assigns.current\u user))

正如greg所说,参数中的id很可能是字符串,因此您必须确保您正在比较相同类型的对象。 但我会避免解析为整数,因为它可能会产生一些意外的结果,例如,如果您的id为nil

我不是长生不老药的专家,但以下是我能想到的一些解决方案:

# String interpolation will automatically cast the interpolated values to string
if "#{conn.assigns.current_user}" == "#{id}" do

# Casting to char list can handle nil values as well as strings and integers
if to_char_list(conn.assigns.current_user) == to_char_list(id) do

# Regular to_string
if to_string(conn.assigns.current_user) == to_string(id) do

如果在99%的情况下,多行
是一种代码气味。您的代码段可能被重写为:

case to_string(conn.assigns.current_user) do
id ->
  render(conn, "show.html", professional: Repo.get!(Professional, id))
_ ->
  conn
  |> put_flash(:error, "You must be logged in for that!")
  |> redirect(to: site_path(conn, :index))
  |> halt()
end
我将此作为一个答案,只是为了说明方法,@greg的答案更好

单行
if
s通常在其他语言中用作三元组,但:

if a < 42, do: "tiny", else: "huge"
如果a<42,则执行“微小”,否则执行“巨大”

如果conn.assigns.current_user===id do,您是否尝试了以下操作?@Chris-是
=
=
在这段代码中的行为方式相同。我没有足够的代表对另一个答案进行评论,但检查参数的更好方法是使用卫士,
when is_binary(id)
防范Nilsh只需解析int。为了熵恒定,复制到这里@格雷格说:“当
是二进制(id)
时,检查参数的更好方法是使用警卫,防止
nils
,”-这是真的。现在不知道在哪里发表评论^^^^我同意使用
if
不是解决问题的灵丹妙药,但是你仍然希望解析为字符串,而不是整数,由于Integer.parse/1将返回
{result,rest}
和String.to_Integer/1是对象类型的一个很强的假设,对吗?@Ninigi解析什么和解析规则是由任务定义的,在这种情况下我不是100%清楚。看起来
到_string
是这里最好的方法。好的,谢谢,只是要确保我在这里没有完全走错方向:)@Ninigi BTW,
case Integer.parse(id)do{current_user,{u}->…
。您的示例存在返回
true
的小故障,例如
nil
和空二进制文件。但是,只有一个操作数应该是cast.Integer.parse/1,这在很大程度上假设您对ID使用Integer,而对于mongodb来说,情况并非如此。这就是为什么我真的不喜欢转换为int而不是string的想法:)