标签: elixir

如何设置默认的Elixir混合任务

如果我有一个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-mix elixir

10
推荐指数
1
解决办法
2007
查看次数

使用Elixir进行基本打印 - IO.puts错误:**(ArgumentError)参数错误(stdlib):io.put_chars(#PID

这是我试图为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.我不打算在这方面做太多,但有没有办法把它放在这种事情的背景下?我一直在想象星球大战的红色领袖.)

io type-conversion elixir

10
推荐指数
1
解决办法
3877
查看次数

Elixir Ecto:如何验证外键约束?

我正在使用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)

elixir ecto phoenix-framework

10
推荐指数
1
解决办法
5697
查看次数

Elixir:带有点和嵌套模块的模块名称 - 它们是等价的吗?

以下代码是否相同?至于调用模块方法,在两种情况下都会使用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)

elixir

10
推荐指数
1
解决办法
2919
查看次数

如何添加条件必填字段?

我有一个带有这个(简化)模式的地址的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为必需而不是可选,但仅当国家/地区是白名单时,但我无法找到一种干净的方式来编写验证.如何添加该约束?

elixir ecto phoenix-framework

10
推荐指数
1
解决办法
1136
查看次数

我应该在控制器或模型中使用Ecto.Repo用于Elixir Phoenix吗?

对于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)

哪一个更好?为什么?

elixir ecto phoenix-framework

10
推荐指数
1
解决办法
2119
查看次数

更改URL以在phoenix框架(elixir)中接受字符串而不是id

我试图在凤凰应用程序中实现永久链接.

目标是将localhost:4000/products/1更改为localhost:4000/products/productname

我尝试跟踪Ryan Bates的一集关于rails中的永久链接实现, 但是无法为凤凰城的模型找到一个to_param函数.

请帮忙.

elixir ecto phoenix-framework

10
推荐指数
2
解决办法
1545
查看次数

如何截断elixir中的字符串?

我正在使用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

10
推荐指数
2
解决办法
2825
查看次数

如何检查Map是否也是一个Struct?

在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

10
推荐指数
4
解决办法
3998
查看次数

检查值是否为关键字列表

Elixir提供了一些is_功能,可以让您检查项目是否是特定类型:

  • is_atom
  • is_binary
  • is_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条款中做到这一点?

elixir

10
推荐指数
1
解决办法
1944
查看次数

标签 统计

elixir ×10

ecto ×4

phoenix-framework ×4

elixir-mix ×1

io ×1

type-conversion ×1