是否可以仅使用纯Ecto查询从数据库中获取10个随机记录,而不是在应用程序端?例如,我不想从数据库中获取所有记录,然后在Elixir中获取它们的随机值(如下所示):
Subscribers
|> Repo.all
|> Enum.take_random(10)
Run Code Online (Sandbox Code Playgroud) 我正在写一个将RNA转换为DNA的函数。输入以字符列表形式出现:'ATCG'因此我遍历每个字母并使用映射来获取转换后的字母。简单。
问题是枚举字符列表后,我无法将其合并回字符列表。Enum.join返回一个字符串,to_charlist只返回一个字符点列表,我看不到其他任何可以帮助的函数。
这是我的代码:
def to_rna(dna) do
dna_to_rna = %{
'G' => 'C',
'C' => 'G',
'T' => 'A',
'A' => 'U'
}
Enum.map(dna, fn(letter) ->
Map.get(dna_to_rna, [letter])
end)
end
Run Code Online (Sandbox Code Playgroud)
这将输出一个字符列表: ['U', 'G', 'C']。如何将此列表转换为字符列表:'UGC'?
我现在正在学习 Elixir,我真的很困惑quote和unquote。以下是我们如何使用 a 创建具有动态名称的函数macro:
defmacro create_fun(n) do
quote do: def unquote(:"times_#{n}")(a), do: a * 4
end
Run Code Online (Sandbox Code Playgroud)
times_6例如,如果我6作为宏参数传递,它会创建 function 。
现在我不明白的是:这里我们取消引用atom :"times_#{n}"。Elixir 文档说,当你引用一个原子时,它会返回一个原子。所以当我取消引用一个原子时,我也应该找回这个原子。这是真的:
iex(15)> Macro.to_string quote do: unquote(:"times_6")
":times_6"
Run Code Online (Sandbox Code Playgroud)
但是()在引用之后使用会给出这样的结果:
iex(14)> Macro.to_string quote do: unquote(:"times_6")()
"times_6()"
Run Code Online (Sandbox Code Playgroud)
带括号的原子突然就不再是原子了。如果我unquote(:"times_6")用:"times_6"它代替则不起作用:
iex(4)> Macro.to_string quote do: :"times_6"()
** (SyntaxError) iex:4: syntax error before: '('
Run Code Online (Sandbox Code Playgroud)
请问这是怎么回事,没明白
我正在使用HTTPoisonElixir 进行网络请求:
HTTPpoison.post "http://localhost:3000/mymodels"," {\"param1\": \"#{value1}\" , \"param2\":\"#{value2}\"} ", [{"Content-Type", "application/json"}]
Run Code Online (Sandbox Code Playgroud)
这是我得到的回应:
{:ok,
%HTTPoison.Response{body: "{\"id\":46,\"result\":18,\"param1\":\"liqueur\",\"param2\":\"quif\"}",
headers: [{"X-Frame-Options", "SAMEORIGIN"},
{"X-XSS-Protection", "1; mode=block"}, {"X-Content-Type-Options", "nosniff"},
{"Location", "http://localhost:3000/mymodels/46"},
{"Content-Type", "application/json; charset=utf-8"},
{"ETag", "W/\"05b8c75e0a5288c835651f48d4b8a80a\""},
{"Cache-Control", "max-age=0, private, must-revalidate"},
{"X-Request-Id", "1e8ae2d3-073a-4779-916a-edffc38f8b5a"},
{"X-Runtime", "0.530440"}, {"Transfer-Encoding", "chunked"}],
status_code: 201}}
Run Code Online (Sandbox Code Playgroud)
我是Elixir的新手,我的问题是我想从中得到results元素response.body
iex(3)> response.body
"{\"id\":46,\"results\":18,\"param1\":\"liqueur\",\"param2\":\"quif\"}"
Run Code Online (Sandbox Code Playgroud)
我不知道如何将此字符串转换为Elixir中的数组/哈希或stuple.我在Enum,但似乎没有用
我想在Elixir中编码这个算法:
var name = generate_name();
while (check_if_exists(name)) {
name = generate_name();
}
Run Code Online (Sandbox Code Playgroud)
我无法在Elixir中以相同的方式编码,因为必须有更多的惯用和功能方式.那怎么办呢?
在我的Phoenix应用程序中,我想向URL添加查询字符串:
some_cool_path(@conn, :index, "view-mode": "table")
Run Code Online (Sandbox Code Playgroud)
我希望它会生成类似的URL /some_cool?view-mode=table,但会引发异常:
protocol Phoenix.Param not implemented for ["view-mode": "table"]
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
我想一次迭代两个列表,但无法弄清楚如何.for循环,允许你有多个列表作为循环嵌套,我不熟悉Enum,但也许有一个解决方案.
Python有zip(list_1,list_2)和enumerate(list_1)做到这一点
在Tcl对我来说更容易:
% foreach var1 [list 1 3] var2 [list 2 4] {
puts "$var1 $var2"
}
1 2
3 4
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何在Elixir中做到这一点.
我想这样做的原因是因为我有这样的地图列表
[%{"a" => "1539", "b" => "300"},
%{"a" => "4095", "b" => "0"},
%{"a" => "5371", "b" => "0"},
%{"a" => "7524", "b" => "0"},
%{"a" => "8267", "b" => "27"}]
Run Code Online (Sandbox Code Playgroud)
我有一个相同大小的项目列表:
["a","b","c","d","e"]
Run Code Online (Sandbox Code Playgroud)
如果地图中的某个元素是某个条件(不是0),我想通过循环一起运行它们来替换地图中的项目:
[%{"a" => "a", "b" => "300"}, # notice the change in element "a"
%{"a" => "4095", "b" …Run Code Online (Sandbox Code Playgroud) 我正在使用 phoenix 创建服务器并使用编辑器 VSCode。
当我启动 server:mix phx.server并且我更改了代码时,它不会重新编译,我必须关闭并再次运行。
应该在可以自动重新编译的地方设置扩展或配置吗?
文件dev.exs
config :jwtuser, Jwtuser.Endpoint,
http: [port: 5000],
debug_errors: true,
code_reloader: true,
check_origin: false,
watchers: [node: ["node_modules/brunch/bin/brunch", "watch", "--stdin",
cd: Path.expand("../assets", __DIR__)]]
Run Code Online (Sandbox Code Playgroud)
在mix.exs 中
def project do
[
app: :jwtuser,
version: "0.0.1",
elixir: "~> 1.4",
elixirc_paths: elixirc_paths(Mix.env),
compilers: [:phoenix, :gettext] ++ Mix.compilers,
start_permanent: Mix.env == :prod,
aliases: aliases(),
deps: deps(),
erlc_options: erlc_options()
]
end
Run Code Online (Sandbox Code Playgroud) 在Aleksei回答的最后一个问题中,我试图查找给定日期的上个月。现在,我正尝试做相反的事情:
defmodule Dating do
def next_month(%Date{year: year, month: month, day: day} = date) do
first_day_of_next_month = Date.add(date, Calendar.ISO.days_in_month(year, month) - day + 1)
%{year: year, month: month} = first_day_of_next_month
Date.add(first_day_of_next_month, min(day, Calendar.ISO.days_in_month(year, month)) - 1)
end
end
Run Code Online (Sandbox Code Playgroud)
尽管代码可以正常运行,但我希望有更好的方法可以做到这一点:
iex|1 ? Dating.next_month(~D[2018-12-31])
#? ~D[2019-01-31]
iex|2 ? Dating.next_month(~D[2018-02-28])
#? ~D[2018-03-28]
iex|3 ? Dating.next_month(~D[2018-01-31])
#? ~D[2018-02-28]
iex|3 ? Dating.next_month(~D[2018-01-30])
#? ~D[2018-02-28]
Run Code Online (Sandbox Code Playgroud)
注意:请不要建议使用第三方Elixir软件包
elixir ×9
calendar ×1
date ×1
datetime ×1
ecto ×1
elixir-mix ×1
enumeration ×1
erlang ×1
function ×1
loops ×1
macros ×1
mongoid ×1
postgresql ×1
quote ×1
ruby ×1
while-loop ×1