如果我有一个mix.exs类似的文件:
defmodule Mix.Tasks.My_task do
use Mix.Task
@shortdoc "Perform my task"
def run(_) do
IO.puts "Working"
end
end
defmodule ElixirKoans.Mixfile do
use Mix.Project
def project do
...
end
Run Code Online (Sandbox Code Playgroud)
我很乐意用这个来运行mix my_task.
我如何my_task成为默认值,所以当我在mix没有任务的情况下运行时会执行它?
这是我试图为Elixir 1.0.3运行的程序:
IO.puts "putstest"
div2 = fn inputnum ->
[:a, inputnum/4, inputnum/7, inputnum/5.0, inputnum/7, inputnum*88]
end
myoutput = div2.(300.0)
IO.puts myoutput
Run Code Online (Sandbox Code Playgroud)
我添加了:一个原子,以防Elixir进行某种隐式转换.
我是Elixir的新手.当我运行上面的代码时,我不断收到以下错误$ elixir putztestzorz.exs:
putstest
** (ArgumentError) argument error
(stdlib) :io.put_chars(#PID<0.24.0>, :unicode, [[:a, 75.0, 42.857142857142854, 60.0, 42.857142857142854, 2.64e4], 10])
(elixir) lib/code.ex:316: Code.require_file/2
Run Code Online (Sandbox Code Playgroud)
我检查了http://elixir-lang.org/docs/master/elixir/IO.html上的文档,但没有IO.stream(将io设备转换为IO.Stream,将最后一行转换为IO.stream output),也没有IO. write(将给定参数写入给定设备,将最后一行更改为IO.write :stdout, output)似乎可以解决问题.
我不想只是猜测,在这里,我似乎不太明白该函数应该做什么.
有没有类似于Python的东西print(),那么,是否有效?
我是否需要列出列表或其他内容?
我可能在这里遗漏了一些非常简单的东西,但我不想在IO处理函数列表中猜测.
(PS文档一直在谈论a Process.group_leader.我不打算在这方面做太多,但有没有办法把它放在这种事情的背景下?我一直在想象星球大战的红色领袖.)
我正在使用Elixir和Phoenix Web框架,但现在我一直试图验证外键约束.因此,给定一个Post包含许多注释的Comment模型,我将模型编写如下:
defmodule MyApp.Comment do
use MyAPp.Web, :model
schema "comments" do
field :body, :text
belongs_to :post, MyApp.Post
timestamps
end
@required_fields ~w(body post_id)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> foreign_key_constraint(:post_id)
end
end
Run Code Online (Sandbox Code Playgroud)
及其单元测试:
defmodule MyApp.CommentTest do
# [...]
test "changeset with non existent post" do
attrs = %{
body: "A comment."
post_id: -1 # some non-existent id?
}
refute Comment.changeset(%Comment{}, attrs).valid?
assert {:post_id, "does not exist"} in …Run Code Online (Sandbox Code Playgroud) 以下代码是否相同?至于调用模块方法,在两种情况下都会使用Utilities.StringUtils.some_method(...)
嵌套模块
defmodule Utilities do
defmodule StringUtils do
end
end
Run Code Online (Sandbox Code Playgroud)
名称中带点的模块
defmodule Utilities.StringUtils do
end
Run Code Online (Sandbox Code Playgroud) 我有一个带有这个(简化)模式的地址的ecto模型:
defmodule Address do
use Ecto.Model
schema "addresses" do
field :zip, :string
field :country, :string
# snip
end
@countries_requiring_zip ~w(US) # snip
def changeset(model, params \\ :empty) do
model
|> cast(params, ~w(country), ~w(zip))
|> validate_zip
end
defp validate_zip(changeset) do
if get_field(changeset, :country) in @countries_requiring_zip do
# ????
end
changeset
end
end
Run Code Online (Sandbox Code Playgroud)
我想标记zip为必需而不是可选,但仅当国家/地区是白名单时,但我无法找到一种干净的方式来编写验证.如何添加该约束?
对于Phoenix的控制器中的一些查询,我有两个计划
计划1:
defmodule Demo.UserController do
# ...
def index do
# This is just for example
# The point is Repo in used here
Repo.all(User)
end
end
Run Code Online (Sandbox Code Playgroud)
计划2:
defmodule Demo.User do
# ...
def all do
# Put all Repo API and building query logic in Model
Repo.all(__MODULE__)
end
end
Run Code Online (Sandbox Code Playgroud)
我更喜欢Plan 2.因为在大多数情况下,我可以把所有关于在Model中获取数据的逻辑放在一起.
但我发现官方指南使用计划1(docs/model)和Phoenix默认代码alias Repo在Controller而不是Model(web/web.ex)
哪一个更好?为什么?
我试图在凤凰应用程序中实现永久链接.
目标是将localhost:4000/products/1更改为localhost:4000/products/productname
我尝试跟踪Ryan Bates的一集关于rails中的永久链接实现, 但是无法为凤凰城的模型找到一个to_param函数.
请帮忙.
我正在使用slu for elixir,我的想法是:我有一个字符串,[a-zA-Z0-9]用连字符分隔.喜欢:
string = "another-long-string-to-be-truncated-and-much-text-here"
Run Code Online (Sandbox Code Playgroud)
我想确保最大字符串长度等于30,但我也希望确保在达到最大长度时单词不会减半.所以前30个符号string是,another-long-string-to-be-trun但我希望有完全删除的another-long-string-to-be单词truncated.我怎样才能做到这一点?
在Elixir中,我可以通过调用来检查变量是a map还是a struct,Kernel.is_map/1因为Structs是下面的Maps,但是我想区分这两者.我知道我可以调用__struct__Struct来获取它的模块名称,但是在普通地图上调用它会抛出:
** (KeyError) key :__struct__ not found in: %{}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何检查变量是地图还是结构?
用例示例:
# I want to handle struct and map inputs differently in my Module
defmodule DifferentThings do
def do_something(arg) when is_map(arg) do
# Do something with Maps
end
def do_something(arg) when is_struct(arg) do
# But handle Structs differently
# Issue is, `is_struct` does not exist
end
end
Run Code Online (Sandbox Code Playgroud) Elixir提供了一些is_功能,可以让您检查项目是否是特定类型:
is_atomis_binaryis_map但是如何检查Elixir中的值是否为关键字列表?我知道在下面,关键字列表是一个2元素元组的列表,第一个元素作为原子,所以我目前的解决方法是:
defmodule KList do
def is_keyword?(list) when is_list(list) do
Enum.all? list, fn item ->
case item do
{k, _} -> is_atom(k)
_ -> false
end
end
end
def is_keyword?(_), do: false
end
Run Code Online (Sandbox Code Playgroud)
有没有更好的(或内置)方式这样做?更重要的是,我怎么能在一个when条款中做到这一点?