在使用泛型的静态类型语言(如C#)中,我可以在方法签名中指定每个映射的键都是一个原子,每个值都是{string,int}元组的列表.如何为Elixir中的函数参数定义类型规范?
PS:如果你正在读这个并且评级> 1500,请你创建一个类型规范标签.
在elixir中,我们可以连接,列表就像这样
ex(52)> [1,2,3,4] ++ [5,6,7]
[1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
我们还可以连接元组吗?像这样的东西?
iex(53)> {1,2,3,4} ++ {5,6,7}
** (ArgumentError) argument error
:erlang.++({1, 2, 3, 4}, {5, 6, 7})
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一另一件事是将元组转换为列表,然后使用to_list和to_tuple函数转换回元组.但那太笨拙了.
嗨,我正在尝试获取Erlang NIF(本机实现函数)的Hello World示例,这里显示的是 http://www.erlang.org/doc/man/erl_nif.html ,可以在OSX 64位上使用Elixir.
首先我创建C代码:
/* niftest.c */
#include "erl_nif.h"
static ERL_NIF_TERM hello(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
return enif_make_string(env, "Hello world!", ERL_NIF_LATIN1);
}
static ErlNifFunc nif_funcs[] =
{
{"hello", 0, hello}
};
ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)
Run Code Online (Sandbox Code Playgroud)
然后我使用gcc64位架构成功编译它,如
Erlang NIF测试 - OS X Lion所示
gcc -undefined dynamic_lookup -dynamiclib niftest.c -o niftest.so -I /usr/local/Cellar/erlang/R14B02/lib/erlang/usr/include
Run Code Online (Sandbox Code Playgroud)
它产生了niftest.so我应该能够从Erlang/Elixir接口的必要文件.我的Elixir(niftest.ex)看起来像这样(灵感来自这里报告的更复杂的例子):
defmodule Niftest do
@onload :init
def init() do
:erlang.load_nif("./niftest", 0)
:ok
end
def hello() do …Run Code Online (Sandbox Code Playgroud) 有一些双下划线函数__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 JSON API中,当我请求数据库中不存在的对象时,我收到了一个Ecto NoResultsError.
我希望我的JSON API返回null以及404错误.
我该怎么做?
目前我几乎有一个默认生成的html控制器/视图等我已经修改了这样的控制器:
def show(conn, %{"id" => id}) do
my_model = Repo.get!(MyModel, id)
case get_format(conn) do
"json" ->
render(conn, my_model: my_model)
_ ->
render(conn, "show.html", my_model: my_model)
end
end
Run Code Online (Sandbox Code Playgroud)
以及观点:
defmodule MyProject.MyModelView do
use Laired.Web, :view
def render("show.json", %{my_model: my_model}) do
my_model
end
end
Run Code Online (Sandbox Code Playgroud)
有关:
假设我有这个问题:
User
|> where([u], u.name == "John" or u.age == 24)
Run Code Online (Sandbox Code Playgroud)
我想把它变成一个函数,可以获取字段名称和字段值的关键字列表,并动态生成相同的查询.函数定义看起来像这样:
def where_any(query, field_names_to_values) do
...
end
Run Code Online (Sandbox Code Playgroud)
Elixir和Ecto有可能吗?
我正在尝试将Guardian实现到我的API中并通过它执行登录以获得JWT.我正在看的教程就在这里.问题是使用类似于他们在示例中使用的用户模型实现登录.Model代码如下所示:
defmodule PushflightServer.User do
use PushflightServer.Web, :model
use Ecto.Repo
import Ecto.Query
alias PushflightServer.Repo
schema "users" do
field :name, :string
field :email, :string
field :encrypted_password, :string
field :password, :string, virtual: true
field :verify_token, :string
field :verify_date, Ecto.DateTime
timestamps
end
def from_email(nil), do: { :error, :not_found }
def from_email(email) do
IO.write("Before email")
IO.inspect(email)
Repo.one(User, email: email)
end
Run Code Online (Sandbox Code Playgroud)
如果我从Phoenix内部或直接在iex -S mix中调用from_email,我会收到以下错误:
user = PushflightServer.User.from_email("rob@json.com")
**(Protocol.UndefinedError)协议Ecto.Queryable没有为User实现,给定的模块不存在(ecto)lib/ecto/queryable.ex:33:Ecto.Queryable.Atom.to_query/1(ecto)lib/ecto /repo/queryable.ex:90:Ecto.Repo.Queryable.execute/5(ecto)lib/ecto/repo/queryable.ex:15:Ecto.Repo.Queryable.all/4(ecto)lib/ecto/repo /queryable.ex:44:Ecto.Repo.Queryable.one/4
我必须遗漏一些简单的东西,但我无法找到有关为什么会发生这种情况的任何文档.使用Repo插入数据工作正常.有任何想法吗?
我正在关注本教程:http://elixir-lang.org/getting-started/mix-otp/agent.html
所以在我的Elixir项目中,我有一个模块lib/kv/bucket.exs,并对它进行测试test/kv/bucket_test.exs.
当我运行混合测试时,我收到以下错误:** (UndefinedFunctionError) undefined function KV.Bucket.start_link/0 (module KV.Bucket is not available)我错过了什么?
我想在一行上有以下案例:
case s do
:a -> :b
:b -> :a
end
Run Code Online (Sandbox Code Playgroud)
宏case被定义为case(condition, clauses).下列
quote do
case s do
:a -> :b
:b -> :a
end
end
Run Code Online (Sandbox Code Playgroud)
得到:
{:case, [],
[{:s, [], Elixir}, [do: [{:->, [], [[:a], :b]}, {:->, [], [[:b], :a]}]]]}
Run Code Online (Sandbox Code Playgroud)
从这里应该可以回到 case(s, ???)
我们正在尝试将我们的Phoenix Web App部署到Linux VM(在我们的Azure案例中)使用edeliver
我们已经使用Azure部署了一个"基本"博客应用程序,edeliver并记录了以下步骤:https:
//github.com/dwyl/learn-微软蔚蓝#部分2 -部署-您的应用程序
而当我们手动运行(" 实 ")的应用程序:https://github.com/nelsonic/healthlocker
使用上的实例MIX_ENV=prod mix phoenix.server运行良好!
当我们使用以下命令将应用程序部署并运行到Azure实例时:
mix edeliver build release --verbose
mix edeliver deploy release to production
mix edeliver start production
Run Code Online (Sandbox Code Playgroud)
我们收到一条肯定的确认消息:
EDELIVER HEALTHLOCKER WITH START COMMAND
-----> starting production servers
production node:
user : root
host : 51.140.86.5
path : /home/hladmin
response: ok
START DONE!
Run Code Online (Sandbox Code Playgroud)
但是当我们netstat -plnt按照check-running-services-on-linux的 …
elixir ×10
ecto ×3
azure ×1
deployment ×1
edeliver ×1
elixir-mix ×1
erlang ×1
erlang-nif ×1
generics ×1
json ×1
macos ×1
native ×1
types ×1