嗨,我在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) 在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 …
我在elixir中试验Macros.因此,我即将展示的代码当然应该用简单的函数完成,但是......我正在试验!
我想定义2个宏(A和B)并使A使用B来试验宏扩展.当我使用A时,我收到一个编译错误,说明函数 B 未定义.
这是代码:
defmodule MyMacros do
defmacro print_expr(expr) do
quote do
IO.puts(unquote(expr))
end
end
defmacro print_hashes_around(expr) do
quote do
IO.puts "###"
print_expr(unquote(expr))
IO.puts "###"
end
end
end
defmodule MyModule do
require MyMacros
def my_print(expr) do
MyMacros.print_hashes_around(expr)
end
end
MyModule.my_print("hello world")
Run Code Online (Sandbox Code Playgroud)
这是编译错误:
macro_test.exs:17: warning: redefining module MyModule
** (CompileError) macro_test.exs:21: function print_expr/1 undefined
(stdlib) lists.erl:1336: :lists.foreach/2
macro_test.exs:17: (file)
(elixir) lib/code.ex:307: Code.require_file/2
Run Code Online (Sandbox Code Playgroud)
我(错)理解事物的方式:
我对吗 ?
至于建议在农闲,前缀print_expr与MyMacros.修复它.我还是不明白为什么.MyModule需要MyMacros这样两个宏都应该是已知的并且可以扩展......当我看到unless …
我是Elixir和Phoenix Framework的新世界.我正在尝试关注TheFireHoseProject教程,但是在使用Ecto查询原始SQL时遇到问题.该教程说这应该工作:
defmodule Queries do
def random do
query = Ecto.Adapters.Postgres.query(
Repo,
"SELECT id, saying, author from quotes ORDER BY RANDOM() LIMIT 1",
[])
%Postgrex.Result{rows: [row]} = query
{id, saying, author} = row
%Splurty.Quote{id: id, saying: saying, author: author}
end
end
Run Code Online (Sandbox Code Playgroud)
我收到一个运行时错误,即Ecto.Adapters.Postgres.query不存在(未定义的函数).
我试图搜索Ecto文档,发现可能有一个名为run_query的函数,但它也不起作用.
我想我正在使用Ecto 1.1.4并且我没有找到任何关于如何使用Ecto查询原始SQL的好(最新)样本.
firehoseproject的链接是:http://phoenix.thefirehoseproject.com/
我要解析一个xml文档,从xml节点中提取一个整数.
目前我有:
try do
Floki.find(node, "stat[type='jersey_num']")
|> Floki.text
|> Integer.parse
|> elem(0)
rescue
e -> nil
end
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但我不喜欢拯救一切,我想做的事情如下:
Floki.find(node, "stat[type='jersey_num']")
|> Floki.text
|> case Integer.parse do
{ int, _binary } -> int
_ -> nil
end
Run Code Online (Sandbox Code Playgroud)
但我进入unhandled operator ->第四行,有没有办法做到这一点?
我是凤凰城/ Elixir的新手,我正试图围绕变革集团.
我知道它包含一组用于创建或更新模型的更改.
我想知道的是,在将更改推送到数据库之前,是否以及如何修改更改.
我的用例如下:
由于不变性约束,我甚至不确定是否可以直接修改变更集,但我可以创建另一个变更集以插入仓库.
欢迎任何建议,并毫不犹豫地指出我可能正在做的不良做法或愚蠢的事情!
编辑以下评论:我正在寻找类似的东西:
defp put_specialty_array(changeset) do
case changeset do
%Ecto.Changeset{valid?: true, changes: %{specialty: spec}} ->
put_change(changeset, :specialty, String.split(spec, ","))
_ ->
changeset
end
end
Run Code Online (Sandbox Code Playgroud) 似乎Elixir 1.3.0不再显示String.strip/1和String.strip/2的文档:
iex(1)> h String.strip
No documentation for String.strip was found
Run Code Online (Sandbox Code Playgroud)
在当前的在线文档(v1.3,Master,Stable)中也缺少它们,但编译器仍然可以识别这些函数:
iex(2)> String.strip(" Hallo, World! ")
"Hallo, World!"
Run Code Online (Sandbox Code Playgroud)
所以我想知道这是否只是String文档中的一个错误,或者这些函数是否会被弃用.我找不到任何更好的信息谷歌搜索.
我试图弄清楚如何将浮点数转换为字符串/二进制,但似乎并不像它看起来那么容易
iex(1)> to_string(1200.00)
"1.2e3"
iex(2)> Float.to_string(1200.00)
"1.2e3"
Run Code Online (Sandbox Code Playgroud)
我们需要"1200.00"出来......只是不是指数表示法
我有两个型号,Person并且Pet,我希望Person能够有很多宠物,但Pet到属于只有一个人:
defmodule MyApp.Person do
use MyApp.Web, :model
alias MyApp.Pet
schema "persons" do
field :name, :string
has_many :pets, Pet
timestamps()
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [])
|> validate_required([])
end
end
Run Code Online (Sandbox Code Playgroud)
和
defmodule MyApp.Pet do
use MyApp.Web, :model
alias MyApp.Person
schema "pets" do
field :name, :string
belongs_to :person, Person
timestamps()
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [])
|> validate_required([]) …Run Code Online (Sandbox Code Playgroud) 我想知道如何在测试时禁用Elixir中的日志记录.在我当前的代码中,我测试记录器消息,所以我不想完全禁用它,但隐藏消息直到任何测试停止传递.
我正在使用mix和ExUnit来管理和测试我的项目.
mix test
Compiling 2 files (.ex)
.........
17:59:18.446 [warn] Code seems to be empty
.
17:59:18.447 [warn] Code doesn't contain HLT opcode
.
17:59:18.448 [warn] Code doesn't contain HLT opcode
17:59:18.448 [error] Label error doesn't exist
.....
Finished in 0.07 seconds
16 tests, 0 failures
Run Code Online (Sandbox Code Playgroud)