凤凰似乎按照字母顺序重新排列了参数,并且模式匹配-这是正常的吗?

问题描述 投票:0回答:2

这是前端中发送请求的代码-注意参数的顺序:

params = {ticket_guid: "XXX-XXX", user_name: "David", quantity: 2}
$.get('/init_stripe_transaction', params, function(data) {

这是浏览器上开发控制台中的“错误请求”数据,显示了参数的顺序:

http://localhost:4000/init_stripe_transaction?ticket_guid=XXX-XXX&user_name=David&quantity=2

这是终端(服务器端)的错误响应,即phoenix elixir def日志。注意-由于某些原因,现在如何更改参数的顺序:

[info] GET /init_stripe_transaction
[debug] Processing with DiceWeb.TransactionController.create_stripe_session/2

Parameters: %{"quantity" => "2", "ticket_guid" => "XXX-XXX", "user_name" => "David"}
Pipelines: [:browser]
[info] Sent 400 in 357ms
[debug] ** (Phoenix.ActionClauseError) no function clause matching in DiceWeb.TransactionController.create_stripe_session/2 

这是我在控制器中进行模式匹配的方式:

def create_stripe_session(
  conn, 
  %{ticket_guid: ticket_guid, user_name: user_name, quantity: quantity}
) do ...

[特供]:我对灵丹妙药/图案匹配非常陌生。因此,确定的堆栈溢出比在phoenix repo上创建问题更好。以这种方式进行图案匹配可以吗?

elixir phoenix-framework elixir-framework
2个回答
0
投票

啊哇-显然还在用Ruby进行思考。

  1. 顺序无关紧要。
  2. :!= =>,当使用地图像这样进行模式匹配时。简单地用粗箭头替换符号样式就解决了我的问题。不管参数在什么顺序上,都更有意义。

0
投票

1)就像在红宝石中一样,地图:

%{a: 1, b: 2} 

是地图的简写:

%{:a => 1, :b => 2}

在iex中:

iex(1)> %{a: 1, b: 2} == %{:a => 1, :b => 2}
true

2]在Elixir中,原子不会被垃圾回收,因此对atom table的大小有硬限制,这是存储原子的位置。 Phoenix可以防止您发送带有1亿个名称/值对的请求,如果将其作为原子/值对移交给您的应用,则会淹没原子表。而是,控制器中的操作会接收带有字符串/值对的映射,然后可以进行模式匹配以挑选出您感兴趣的字符串/值对。其余的字符串/值对将被垃圾回收。按照约定,然后将您模式匹配的键/值对转换为供内部使用的原子/值对,例如:

def world(conn, %{"name" => name}) do 
    render(conn, "world.html", name: name)
end 

3)字符串不等同于原子:

iex(1)> "a" == :a
false

因此,如果某个函数的参数变量指定了一个具有原子作为键的映射,则该函数将不会与键为字符串的映射进行模式匹配:

defmodule My do
  def go(%{:a => x}) do
    IO.puts x
  end
end

My.go(%{"a" => 10})

在命令行:

~/elixir_programs$ elixir a.exs
** (FunctionClauseError) no function clause matching in My.go/1    

    The following arguments were given to My.go/1:

        # 1
        %{"a" => 10}

    a.exs:2: My.go/1
    (elixir) lib/code.ex:767: Code.require_file/2

4)最终,您将遇到类似这样的内容:

def go(%User{}) do
   ...
end

[%User{}匹配任何用户结构。

© www.soinside.com 2019 - 2024. All rights reserved.