Elixir里有一些奇怪的东西String.to_integer.没什么大不了的,但我想知道是否有办法用管道操作员链接我的所有功能.
这是问题所在.这行代码(你可以试试"iex"):
[5, 6, 7, 3]
|> Enum.reverse
|> Enum.map_join "", &(Integer.to_string(&1))
Run Code Online (Sandbox Code Playgroud)
返回字符串 "3765"
我想要的是一个整数.所以我只需要|> String.to_integer在前一个语句的末尾添加这段代码,我应该有一个整数.我们试试吧.这段代码:
[5, 6, 7, 3]
|> Enum.reverse
|> Enum.map_join "", &(Integer.to_string(&1))
|> String.to_integer
Run Code Online (Sandbox Code Playgroud)
给我这个:"3765".不是整数,一个字符串!
如果我这样做:
a = [5, 6, 7, 3]
|> Enum.reverse
|> Enum.map_join "", &(Integer.to_string(&1))
String.to_integer(a)
Run Code Online (Sandbox Code Playgroud)
它返回一个整数:3765.
这就是我现在正在做的事情,但它让我很生气,因为我很乐意将所有这些功能与惊人的管道操作员联系起来.
感谢您的帮助或灯光.Elixir非常有趣!
我有一个十六进制值的数据包,我正在尝试处理.它们以字符串形式出现.例如,一个数据包是C0,即192.但是,我不太确定如何将字符串值转换为整数值.
如果我用这个:
Base.decode16!("C0")
# <<192>>
Run Code Online (Sandbox Code Playgroud)
......我得到了二进制文件.
我能想到提取这个整数值的唯一方法是这样的:
<<x>> = Base.decode16!("C0")
x
# 192
Run Code Online (Sandbox Code Playgroud)
这是有效的,似乎有点惯用,但我是Elixir的新手,并且不确定这是否是最好的解决方案.您如何将字符串十六进制值转换为Elixir中的整数?
我几乎在所有控制器中都需要以下功能.在Elixir中是否有类似ApplicationController的模块?
我们应该把它们放在哪里?
def redirect_if_unauthorized(conn = %Plug.Conn{assigns: %{authorized: false}}, opts) do
conn
|> put_flash(:error, "You can't access that page!")
|> redirect(to: "/")
|> halt
end
def redirect_if_unauthorized(conn = %Plug.Conn{assigns: %{authorized: true}}, opts), do: conn
Run Code Online (Sandbox Code Playgroud) 使用phoenix框架,:id, :integer会自动生成.
http://www.phoenixframework.org/docs/ecto-custom-primary-keys
但我希望它不会自动生成并使用自定义ID字段,例如:id, :string,像这样
http://ruby-journal.com/how-to-override-default-primary-key-id-in-rails/
设置
defmodule MyApp.Item do
use MyApp.Web, :model
# @primary_key {:id, :id, autogenerate: false}
schema "items" do
field :id, :string, autogenerate: false # some unique id string
field :type, :integer
Run Code Online (Sandbox Code Playgroud)
它引发了** (ArgumentError) field/association :id is already set on schema https://github.com/elixir-lang/ecto/blob/db1f9ccdcc01f5abffcab0b5e0732eeecd93aa19/lib/ecto/schema.ex#L1327
我想在Ecto.Changeset上设置一个非特定于字段的错误.
在我的情况下,我有一个登录表单,我想设置一个错误,说电子邮件或密码无效.但是我还是想在它们为空时突出显示email或password字段.
在Rails中,您可以通过添加条目来实现errors[:base].在Ecto中有等价物吗?
我有一个特定的控制器动作,我想要渲染没有任何布局.
我尝试在控制器级别没有插件的情况下渲染,但它没有用.
defmodule Hello.PageController do
use Hello.Web, :controller
plug :put_layout, nil
def landing(conn, _params) do
render conn, "landing.html"
end
end
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
当我输入iex -S mixPowerShell时,我收到此错误:
Invoke-Expression : A positional parameter cannot be found that accepts argument 'mix'.
At line:1 char:1
+ iex S mix
+ ~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Invoke-Expression], ParameterBindingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.InvokeExpressionCommand
Run Code Online (Sandbox Code Playgroud)
在'iex'命令之后编写'-S mix'以获得在cmd中输入相同效果的正确方法是什么?我不相信PowerShell语法,这是一个问题.
我想要一个Elixir函数来生成一个n参数出现列表,类似于Haskell的replicate函数:
Input: replicate 3 5
Output: [5,5,5]
Input: replicate 5 "aa"
Output: ["aa","aa","aa","aa","aa"]
Input: replicate 5 'a'
Output: "aaaaa"
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个"复制"整数n时间的函数:
import String
def replicate(number, n)
String.duplicate(to_string(number), n)
|> split("", trim: true)
|> Enum.map(fn n -> String.to_integer(n) end
end
Run Code Online (Sandbox Code Playgroud)
但这与规格不符:(.你能帮帮我吗?
我有一个Elixir/Mix应用程序(也有凤凰城,但也有很多非凤凰城的东西),我想知道什么是最好的做法,用于放入"启动"代码,例如动态地将孩子添加到主管,解雇关闭"我还活着!" ping或其他你希望在启动后立即发生的事情.
一个显而易见的地方是Application文件,但预期的返回是从中返回的Supervisor.start_link(children, opts).所以,例如,在Phoenix应用程序中,我可以这样做:
defmodule MyApp do
use Application
def start(_type, _args) do
import Supervisor.Spec
children = [
supervisor(MyApp.Repo, []),
supervisor(MyApp.Endpoint, []),
supervisor(MyApp.DynamicSupervisorThingy, [])
]
opts = [strategy: :one_for_one, name: MyApp.Supervisor]
start_val = Supervisor.start_link(children, opts)
# --- Put things right here that I want to start ----
MyApp.DynamicSupervisorThingy.add_children_dynamically()
MyApp.SomeModule.do_some_thingy()
MyApp.OtherModule.send_some_pings()
if MIX_ENV == :prod do
MyApp.YetAnother.prod_stuff_i_dont_want_in_dev()
end
start_val
end
end
Run Code Online (Sandbox Code Playgroud)
这似乎是错的,但我无法弄清楚我应该把这段代码放在哪里.
我有以下代码:
@spec test_pass(String.t) :: (:failed | {:ok, map()})
def test_pass(pass) do
db_user = %{password_hash: @hash_for_foo}
with {:ok, ^db_user} <- Comeonin.Argon2.check_pass(db_user, pass) do
{:ok, db_user}
else
_ -> :failed
end
Run Code Online (Sandbox Code Playgroud)
结束
Dyalizer给了我“无法匹配的错误”:
?my_file?.ex:25: The pattern {'ok', _} can never match the type {'error',<<_:64,_:_*8>>}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么?我知道它不匹配,而且我实际上不在乎,这就是为什么我with首先使用它的原因。所有不匹配的情况都在中处理else。
我该如何更改自己dialyzer满意的代码?
我不在找@dialyzer {:nowarn_function, …}。我已经尝试过用身体的{:error, _} -> …表情,else但无济于事。
Erlang / Elixir版本(elixir -v):
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] …Run Code Online (Sandbox Code Playgroud) elixir ×10
action ×1
controller ×1
dialyzer ×1
ecto ×1
haskell ×1
layout ×1
list ×1
powershell ×1
typechecking ×1