标签: elixir

Elixir,IO.inspect不修剪一长串清单

当我做:

IO.inspect [:right, :top, :left, ...very_long_list]
Run Code Online (Sandbox Code Playgroud)

我只得到第一项(这是解决15拼图的动作列表),如下所示:

[:right, :top, :left, :bot, :bot, :left, :top, :top, :right, :right, :bot,
  :left, :bot, :left, :top, :right, :bot, :right, :top, :top, :left, :bot,
  :left, :top, :right, :right, :bot, :bot, :left, :top, :top, :left, :bot,
  :right, :top, :right, :bot, :left, :left, :top, :right, :bot, :right, :top,
  :left, :left, :bot, ...] # => See the '...'
                                instead I would like 
                                to get the complete list
Run Code Online (Sandbox Code Playgroud)

如何判断IO.inspect不修剪清单?有选择还是什么?

elixir inspect

37
推荐指数
2
解决办法
8939
查看次数

如何在Elixir模块中定义常量?

在Ruby中,如果一个人在类中定义常量,他们将使用全部大写来定义它们.例如:

class MyClass
  MY_FAVORITE_NUMBER = 13
end
Run Code Online (Sandbox Code Playgroud)

你是怎么做到Elixir的?如果不存在这样的等价物,你如何解决Elixir中的魔法数字问题?

elixir

37
推荐指数
5
解决办法
1万
查看次数

如何使用迁移更改Ecto模型中的列名?

有没有人知道(或可以提供)如何使用ecto DSL更改表列名称的示例

我猜我只是使用mix ecto.gen.migration然后我会用我的自定义代码填写空的创建文件(如果是这样,你将如何编辑列名,文档显示修改以更改列类型)

或者是否有一个命令行标志我可以传递给我生成迁移代码?

elixir ecto

36
推荐指数
2
解决办法
8223
查看次数

如何在Elixir或Erlang中在运行时动态创建和加载模块?

基本方案是:我需要从数据库加载文本,然后将该文本转换为Elixir模块(或Erlang模块),然后调用它.该文本实际上与模块文件相同.所以这是一种热代码加载形式.我想编译"文件",然后加载生成的模块,然后调用它.后来我会把它卸下来.唯一的区别是代码存在于数据库中而不是磁盘上的文件中.(当我正在编写将加载它的代码时,它不存在.)

我知道Erlang支持热代码加载,但似乎专注于编译磁盘上的文件然后加载梁.我希望这是一个更动态的过程,我不会替换正在运行的代码,而是加载代码,然后运行它,然后卸载它.

Elixir中有几个工具用于在运行时评估代码.我正在试图弄清楚如何使用它们,文档有点稀疏.

Code.compile_string(string, "nofile")
Run Code Online (Sandbox Code Playgroud)

"返回元组列表,其中第一个元素是模块名称,第二个元素是其二进制元素".所以,现在我有了模块名称和它们的二进制文件,但我不知道如何将二进制文件加载到运行时并调用它们.我该怎么办?(我可以看到代码库中没有这个功能.)

可能我可以使用Erlang函数:

:code.load_binary(Module, Filename, Binary)  ->
           {module, Module} | {error, What}
Run Code Online (Sandbox Code Playgroud)

好的,所以这会返回一个带有原子"module"然后是Module的元组.如果从数据库加载的字符串定义了一个名为"Paris"的模块,那么我的代码将如何执行

paris.handler([parameters])
Run Code Online (Sandbox Code Playgroud)

既然我事先不知道会有一个名为巴黎的模块?我可以知道,通过让字符串"paris"也存储在数据库中这是名称,但是有没有办法调用模块,使用字符串作为你正在调用的模块的名称?

还有:

eval(string, binding // [], opts // [])
Run Code Online (Sandbox Code Playgroud)

其中评估字符串的内容.这个字符串可以是模块的整个定义吗?看来不是.我希望能够编写这样的代码,使其具有多个相互调用的函数 - 例如一个完整的小程序,具有预定义的入口点(可能是主要的,例如as"DynamicModule.handle([parameter,list])"

然后是EEx模块,它具有:

compile_string(source, options // [])
Run Code Online (Sandbox Code Playgroud)

这对做模板很有用.但最终它似乎只适用于有一个字符串并且你已经嵌入了Elixir代码的用例.它在选项的上下文中计算字符串并生成一个字符串.我正在寻求将字符串编译成一个或多个我可以调用的函数.(如果我只能创建一个很好的函数,那么该函数可以模式匹配或切换到执行其他所需的事情....)

我知道这是非常规的,但我有理由这样做,他们是好的.我正在寻找有关如何做到这一点的建议,但不需要被告知"不要那样做".看起来它应该是可能的,Erlang支持热代码加载,而Elixir非常动态,但我只是不知道语法或正确的函数.我将密切关注这个问题.提前致谢!


编辑基于第一个答案:

谢谢你的答案,这是一个很好的进展.正如Yuri所示,eval可以定义一个模块,正如José指出的那样,我可以使用代码eval来处理带有绑定的小部分代码.

被评估的代码(无论是否变成模块)都会相当复杂.它的开发最好是将其分解为函数并调用这些函数.

为了帮助,让我提供一些背景信息.假设我正在构建一个Web框架.从数据库加载的代码是特定URI的处理程序.因此,当HTTP调用进来时,我可能会加载example.com/blog/的代码.此页面可能涉及几个不同的内容,例如注释,最近发布的列表等.

由于许多人同时访问该页面,我正在产生一个处理每个页面视图的过程.因此,对于不同的请求,有很多时候可以同时评估该代码.

模块解决方案允许人们将代码分解为页面不同部分的函数(例如:帖子列表,注释等).我会在启动时加载模块一次,让许多进程产生该调用进去.该模块是全球性的,对吗?

如果已经定义了模块会发生什么?EG:模块更改时,有进程已调用该模块.

在iex中,我能够重新定义已经定义的模块:

iex(20)> Code.eval "defmodule A do\ndef a do\n5\nend\nend"
nofile:1: redefining module A
Run Code Online (Sandbox Code Playgroud)

如果我在运行时将模块重新定义到当前调用该模块的所有进程,会发生什么?此外,在正常操作中,这种重新定义是否会在iex之外工作?

假设重新定义模块会有问题,并且全局模块可能遇到命名空间冲突的问题,我研究了使用eval来定义函数.

如果我只能从数据库定义函数的代码,那么这些函数都在任何进程的范围内,并且我们没有全局冲突的可能性.

但是,这似乎不起作用:

iex(31)> q = "f = function do
...(31)> x, y when x > 0 -> x+y
...(31)> x, y -> …
Run Code Online (Sandbox Code Playgroud)

erlang module dynamic elixir

35
推荐指数
2
解决办法
1万
查看次数

酏剂中方案与行为的区别

行为定义回调和协议定义没有签名的方法.实现协议的模块应该为所有这些方法提供定义.使用行为的模块也是如此.什么是语义差异?

我能想到的一个区别是,协议只能针对单一类型实现一次,因为我们可以根据我们的要求多次实现模块的行为.我很清楚何时使用什么.除此之外还有其他区别吗?

elixir

35
推荐指数
2
解决办法
3971
查看次数

Elixir - 循环并添加到地图

我正在使用C#构建的一些代码在Elixir中重建一些东西.

这是非常黑客攻击,但完美的工作(虽然不是在Linux上,因此重建).

基本上它做的是检查一些RSS提要并查看是否有任何新内容.这是代码:

Map historic (URL as key, post title as value).
List<string> blogfeeds
while true
for each blog in blogfeeds
   List<RssPost> posts = getposts(blog)
   for each post in posts
        if post.url is not in historic
           dothing(post)
           historic.add(post)
Run Code Online (Sandbox Code Playgroud)

我想知道如何在Elixir中有效地进行Enumeration.而且,似乎我在"历史性"中添加东西的过程就是反功能编程.

显然,第一步是声明我的URL列表,但除此之外,枚举的想法正在弄乱我的脑袋.有人可以帮帮我吗?谢谢.

enumeration elixir

35
推荐指数
1
解决办法
2万
查看次数

如何使用Elixir生成随机url安全字符串

我需要能够生成随机url安全字符串,以便我可以在链接中使用它们(比如发送到用户电子邮件的激活链接),那么我该如何生成呢?有没有办法只使用Elixir或我必须使用一些库?

elixir phoenix-framework

35
推荐指数
3
解决办法
2万
查看次数

在Elixir中将Ecto模型编码为JSON

我正在阅读以下教程,试图了解一下elixir和phoenix:

https://robots.thoughtbot.com/testing-a-phoenix-elixir-json-api

我遇到了测试问题,主要是使用Poison.encode!在Contact模型上.我收到以下错误:

unable to encode value: {nil, "contacts"}
Run Code Online (Sandbox Code Playgroud)

这导致我出现以下问题:

https://github.com/elixir-lang/ecto/issues/840 和修复:https: //coderwall.com/p/fhsehq/fix-encoding-issue-with-ecto-and-poison

我已将博客文章中的代码添加到lib/poison_encoder.ex中,但我现在收到以下错误:

no function clause matching in Poison.Encoder.Any.encode/2
Run Code Online (Sandbox Code Playgroud)

我在lib/poison_encoder.ex中的代码:

defimpl Poison.Encoder, for: Any do
  def encode(%{__struct__: _} = struct, options) do
    map = struct
          |> Map.from_struct
          |> sanitize_map
    Poison.Encoder.Map.encode(map, options)
  end

  defp sanitize_map(map) do
    Map.drop(map, [:__meta__, :__struct__])
  end
end
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

35
推荐指数
1
解决办法
7843
查看次数

什么是凤凰灵药的变化集

我在理解changeset模型时遇到问题.它能做什么?我们可以在一个模型中拥有多个变更集吗?例如一个用于创建,另一个用于更新.

有人可以用简单的方式详细说明,这样可以帮助其他人来凤凰城.

elixir ecto phoenix-framework

35
推荐指数
2
解决办法
9490
查看次数

在elixir中断言列表的大小

我想断言列表的大小.目前我这样做如下:

assert devices = Repo.all from d in device, where d.uuid == ^attrs.uuid
assert devices.first == devices.last
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

elixir

35
推荐指数
1
解决办法
2万
查看次数

标签 统计

elixir ×10

ecto ×3

phoenix-framework ×3

dynamic ×1

enumeration ×1

erlang ×1

inspect ×1

module ×1