嗨,我在Elixir中寻找转置功能.例如,我有这种数组a,在调用函数后,结果应为b:
a = [[1, 2], [3, 4], [5, 6]]
b = transpose(a)
b => [[1, 3, 5], [2, 4, 6]]
Run Code Online (Sandbox Code Playgroud) 我想从Elixir中的单元测试中分离出集成测试.我发现Elixir mix文档有一个关于过滤器的部分,并描述了我想要做的事情.
然后将下面的行添加到appdir/test/test_helper.exs中
# Exclude all external tests from running
ExUnit.configure exclude: [external: true]
Run Code Online (Sandbox Code Playgroud)
那么一个标签如何测试为"外部"?
我有一个小凤凰应用程序,允许用户登录并查阅他们的个人资料.我使用了以下简单路线:
resources "/users", MyApp.UserController
Run Code Online (Sandbox Code Playgroud)
但这允许每个用户通过:index操作查看用户列表,以及删除或更新任何用户.
限制访问管理员的最简单方法是什么?我应该在每个动作前加一张支票吗?或者我应该创建一个"/admin"可以处理这些操作的资源?推荐的方式是什么?
在iex控制台上,我发现以下错误,我不确定我做错了什么...
case %{} do
x when x == %{} -> true
_x -> false
end
Run Code Online (Sandbox Code Playgroud)
导致以下错误:
** (ErlangError) erlang error: :guard_expr
Run Code Online (Sandbox Code Playgroud)
另外,我想解释一下我是如何找到这个的.我试图让我自己||看的灵药的实现,改变它来治疗宏[],{}和%{}同false和nil.
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2313
这是实现(它有同样的问题):
defmodule Or do
defmacro left || right do
quote do
case unquote(left) do
x when x in [false, nil] or x == [] or x == {} or x == %{} ->
unquote(right)
x ->
x
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
带走or …
有一些双下划线函数__before_compile__,在Elixir中编译时自动调用.但是,我也看到了许多双下划线__functions__,似乎没有神奇的要求.例如,在Ecto中,调用以下函数
Ecto.Schema.__source__(source),
Ecto.Schema.__fields__(fields),
Ecto.Schema.__assocs__(assocs),
Ecto.Schema.__primary_key__(primary_key_field),
Run Code Online (Sandbox Code Playgroud)
什么是合格的__functions__,有双重下划线?
ps:在jose的回答之后将'methods'重命名为'functions'.方法是一个oop术语,在这里不合适.
我正在开发一个带有由Phoenix支持的Web界面的应用程序,我正在探索当前SQLite(及其Ecto驱动程序)的替代存储方法(是的,我听说过PGSQL,不,我不愿意使用它.)
我想使用LevelDB和H2LevelDB,它在Github上有一个Erlang驱动程序
然而,在编译时我意识到Phoenix似乎很依赖Ecto,即使在负责渲染eex模板的模块中也是如此.我发现有点可怕,有点奇怪,同时有点烦人.那么,从预先生成的文件中盲目地清除对Ecto的所有引用是否安全,或者我应该为我的Web UI切换到其他内容?
我想在没有第三方库的情况下获得Phoenix/Elixir的当前日期时间戳.或者简单地说,我想要类似的东西DateTime.now().我怎样才能做到这一点?
我需要获取客户端的IP地址,这不起作用:
def create(conn) do
ip_address = conn.inet.ip_address
# ....
Run Code Online (Sandbox Code Playgroud)
由于key :inet not found in: %Plug.Conn.我怎样才能获得IP地址呢?
我对Elixir中的变量赋值有疑问.在Erlang中,这会引发no match of right hand side value:
X = 4.
X = 2.
Run Code Online (Sandbox Code Playgroud)
但是,Elixir似乎完全可以为变量赋值不止一次.我很困惑模式匹配在Elixir中是如何工作的.Elixir如何区分模式匹配和变量赋值?根据我的理解,在Erlang中,它X是一个未绑定的变量,因此它可以与任何东西匹配,对吗?但是一旦绑定,模式匹配只有在与它相同的值时才有效X.那么Elixir与Erlang没有共享相同的未绑定变量概念吗?
我希望能够在管道中提取元组的第N项,而不使用with或以其他方式分解管道.Enum.at除了元组不是枚举这一事实外,它会完美地工作.
这是一个激励人心的例子:
colors = %{red: 1, green: 2, blue: 3}
data = [:red, :red, :blue]
data
|> Enum.map(&Map.fetch(colors, &1))
|> Enum.unzip
Run Code Online (Sandbox Code Playgroud)
这回来了{[:ok, :ok, :ok], [1, 1, 3]},假设我只想提取[1, 1, 3]
(对于这种特殊情况,我可以使用,fetch!但对于我不存在的实际代码.)
我可以补充一下
|> Tuple.to_list
|> Enum.at(1)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点,不需要从每个元组创建一个临时列表?