标签: elixir

Elixir is_range守卫没有定义?我该怎么用?

我想用一名is_range()后卫.例如:

def foo(bar) when is_range(bar) do
    # stuff
end
Run Code Online (Sandbox Code Playgroud)

is_range不存在?我正在使用Elixir 1.0.5

我试过了

def foo(bar) when Range.range?(bar) do
    # stuff
end
Run Code Online (Sandbox Code Playgroud)

但这也行不通.

我该怎么办?

elixir

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

如何在Elixir for Enum.map中传递arity 2的函数作为参数?

假设我有类似的东西:

    Enum.map(list, fn(x) -> String.duplicate("a", someValue * x) end)
Run Code Online (Sandbox Code Playgroud)

但相反,我想将String.duplicate/2函数作为参数传递,以简化我的代码:

Enum.map(list, &String.duplicate/2)
Run Code Online (Sandbox Code Playgroud)

我知道你可以为arity 1功能做到这一点:

Enum.map(list, &String.downcase/1)
Run Code Online (Sandbox Code Playgroud)

谢谢!

enums functional-programming function elixir arity

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

如何更新Ecto中的关系?

我有这样的订阅.

defmodule Rebirth.Subscription do
  use Rebirth.Web, :model

  schema "subscriptions" do
    ...
    belongs_to :user, Rebirth.User
    ...
  end

  ...

  def update_user(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
    |> cast_assoc(:user, required: false)    
  end
end
Run Code Online (Sandbox Code Playgroud)

我想将用户与订阅相关联

所以我试过了

Rebirth.Subscription.update_user(subscription, %{user_id: 1})
Run Code Online (Sandbox Code Playgroud)

要么

Rebirth.Subscription.update_user(subscription, %{user: user})
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到以下错误:

** (ArgumentError) unknown assoc `user` in `cast_assoc`
Run Code Online (Sandbox Code Playgroud)

如何更新user_id?

谢谢!

elixir ecto phoenix-framework

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

Elixir Pry无法执行私有方法?

elixir的pry可以在模块中运行私有方法吗?例如:

defmodule Test do
  require IEx

  def foo do
    IEx.pry
  end

  defp bar do
  end
end
Run Code Online (Sandbox Code Playgroud)

此时呼叫bar不起作用.我对elixir很新,有什么我做错了或者为什么这是不可能的?

elixir pry

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

使用ilike在Ecto中搜索部分字符串

我试图在数据库中搜索一个字符串是否匹配数据库中另一个字符串的一部分.我可以让它匹配,如果两个确切使用ilike,但当我只搜索字符串的一部分时,它不会捕获包含它的数据.以下是我的代码查询的代码:

    servicesstate = Repo.all(from p in Callme.Service, where: ilike(p.locations, ^zip.state))
Run Code Online (Sandbox Code Playgroud)

当价值准确时它会匹配("南卡罗来纳州","南卡罗来纳州"),但我希望它匹配的时候("位于南卡罗来纳州","南卡罗来纳州")

谢谢

elixir ecto phoenix-framework

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

如何检查协议是否已实现?

我想知道是否有任何方法可以问Elixir 这个对象是否实现了该协议,类似于obj |> implements(Enumerable)什么?

基本上,我必须区分结构和地图.我目前的解决方案有点难看:

try
  obj |> Enum.each ...
rescue 
  e in Protocol.UndefinedError -> obj |> Maps.keys ...
end
Run Code Online (Sandbox Code Playgroud)

上面的工作,但我更喜欢使用模式匹配,如:

cond do
  obj |> is_implemented(Enumerable) -> ...
  _ -> ...
end
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?可以明确检查对象是否实现了所需的协议?

elixir

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

将 include_type_name 放在 config.exs 的何处

我想从我的 elixir config.exs 文件创建一个 Elasticsearch 7.x 索引:

config :app_core, App.Tools.ElasticsearchCluster,
  url: System.get_env("ELASTIC_HOST"),
  # username: "username",
  # password: "password",
  api: Elasticsearch.API.HTTP,
  json_library: Poison,
  indexes: %{
    indie: %{
      settings: "priv/elasticsearch/indies.json",
      store: App.Tools.ElasticSearch.Indie.Store,
      sources: [App.Data.Schema.Indie],
      bulk_page_size: 5000,
      bulk_wait_interval: 15_000
    }
  }
Run Code Online (Sandbox Code Playgroud)

priv/elasticsearch/indies.json开头

{
  "mappings": {
     "_doc":    {
      "properties": {
        "category" : {
          "type": "nested",
          "properties" : {
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试创建索引时,出现错误

"The mapping definition cannot be nested under a type [_doc] unless include_type_name is set to true."
Run Code Online (Sandbox Code Playgroud)

有谁知道如何在我引用的上下文中解决这个问题(将它放在特定查询的前面是行不通的)?

应 Assael Azran 的要求,这里是完整的 indies.json:

{ …
Run Code Online (Sandbox Code Playgroud)

elixir elasticsearch

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

使用Elixir的:httpc erlang模块

我对elixir很新,并且没有erlang经验(或功能性的东西),但很快就会变得明显.. - >

iex(2)> :inets.start()
:ok
iex(3)> :httpc.request(["http://www.erlang.org"])
{:error, :no_scheme}
Run Code Online (Sandbox Code Playgroud)

我不知道是什么:no_scheme意味着什么.我用谷歌搜索了no_scheme和东西,我确信它很明显,但我没有发现任何真的.我在erlang文档中找到的唯一模糊相关的东西是 - >

iex(4)> :http_uri.scheme_defaults
[http: 80, https: 443, ftp: 21, ssh: 22, sftp: 22, tftp: 69]
Run Code Online (Sandbox Code Playgroud)

或者我可能不符合RFC2616或其他......我没有想法(现在).

Elixir和Erlang超级超级棒,但是任何帮助我的旅程都会受到赞赏.

谢谢你的帮助!

我在erl中尝试过.

1> inets:start().
ok
2> httpc:request("http://www.erlang.org").
{ok,{{"HTTP/1.1",200,"OK"},
     [{"date","Wed, 20 Nov 2013 23:15:45 GMT"},
      {"server","inets/5.7.1"},
      {"content-length","10385"},
      {"content-type","text/html; charset=utf-8"},
      {"set-cookie",
       "eptic_cookie=erlangorg@hades-3680318586833850369; path=/"}],
        "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE htm
    etc...
Run Code Online (Sandbox Code Playgroud)

编辑:

好吧,我最大的问题是我是双引用"http://www.erlang.org"字符串而我猜elixir - > erlang将它们引入像parrotys一样的单引号'http://www.erlang.org'.

no_scheme仍然很神秘.我能找到的只是与重定向和RFC实现相关的东西.我刚刚决定将它视为一般错误,与url有关..

编辑2:

这里有一篇博客文章,有人解释得很好.链接

像数据库这样的Erlang原子成为:数据库和Erlang版本中的PgConn之类的局部变量在Elixir中成为pg_conn.

当它们是Erlang函数的参数时,我们需要单引号字符串文字.如果您有一个存储在Elixir变量中的UTF-8字符串,您可以使用binary_to_list/1函数将其转换为char列表.

编辑3:

具有讽刺意味的是,几小时前发布的名为"HTTP客户端"的最新Elixir Sip涵盖了我的整个问题.看看有人遇到这个是未来!

elixir

9
推荐指数
3
解决办法
5504
查看次数

在Ecto中按DateTime查询

这是我尝试过的.

date = Ecto.DateTime.from_erl(:calendar.universal_time())
query |> where([record], record.deadline >= ^date)
Run Code Online (Sandbox Code Playgroud)

我也试过了

date = Ecto.DateTime.from_erl(:calendar.universal_time())
query = from m in MyApp.SomeModel,
      where: m.deadline >= ^date,
      select: m
Run Code Online (Sandbox Code Playgroud)

两者都返回相同的消息

value `%Ecto.DateTime{..}` in `where` cannot be cast to type :datetime in query
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我应该在我的查询中使用Ecto.DateTime.也许我错过了一些明显的东西?谢谢!

elixir ecto phoenix-framework

9
推荐指数
1
解决办法
3163
查看次数

为远程erlang节点运行观察者:使其更简单

我有一个kubernetes集群.

我可以轻松连接到远程容器,并运行连接到live production erlang节点的shell节点:

$ kubectl exec myapp-2431125679-cwqvt -i -t -- iex --name debugging@127.0.0.1 --remsh myliveapp@127.0.0.1 --cookie my_secret_cookie

Erlang/OTP 18 [erts-7.3.1] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.3.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(myliveapp@127.0.0.1)1>
Run Code Online (Sandbox Code Playgroud)

我需要的,虽然是要能够运行:observer针对远程现场制作的Erlang节点.

我也可以这样做:

  1. 杀死本地epmd进程:

    killall epmd
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将选定的远程端口转发到本地计算机:

    kubectl port-forward myapp-2431125679-cwqvt 35609 4369
    
    Run Code Online (Sandbox Code Playgroud)

    我知道我的应用程序在远程容器上的端口35609上epmd运行,默认情况下4369是端口运行,这是我的远程容器的情况.

  3. 跑:

    iex --name debugging@127.0.0.1 --cookie marketplace -e ':observer.start()'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从顶部菜单中选择我感兴趣的应用程序:observer.

我的问题是:

  1. 这样做可以更简单吗?
  2. 有什么我应该知道的kubernetes,以便能够编写一个连接到远程节点并做我想要的单线程吗?

最终,我可以将此过程变为单行或将其转换为shell脚本吗?

现在杀人 …

erlang elixir kubernetes

9
推荐指数
1
解决办法
793
查看次数