当我做:
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不修剪清单?有选择还是什么?
在Ruby中,如果一个人在类中定义常量,他们将使用全部大写来定义它们.例如:
class MyClass
MY_FAVORITE_NUMBER = 13
end
Run Code Online (Sandbox Code Playgroud)
你是怎么做到Elixir的?如果不存在这样的等价物,你如何解决Elixir中的魔法数字问题?
有没有人知道(或可以提供)如何使用ecto DSL更改表列名称的示例
我猜我只是使用mix ecto.gen.migration然后我会用我的自定义代码填写空的创建文件(如果是这样,你将如何编辑列名,文档显示修改以更改列类型)
或者是否有一个命令行标志我可以传递给我生成迁移代码?
基本方案是:我需要从数据库加载文本,然后将该文本转换为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) 行为定义回调和协议定义没有签名的方法.实现协议的模块应该为所有这些方法提供定义.使用行为的模块也是如此.什么是语义差异?
我能想到的一个区别是,协议只能针对单一类型实现一次,因为我们可以根据我们的要求多次实现模块的行为.我很清楚何时使用什么.除此之外还有其他区别吗?
我正在使用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列表,但除此之外,枚举的想法正在弄乱我的脑袋.有人可以帮帮我吗?谢谢.
我需要能够生成随机url安全字符串,以便我可以在链接中使用它们(比如发送到用户电子邮件的激活链接),那么我该如何生成呢?有没有办法只使用Elixir或我必须使用一些库?
我正在阅读以下教程,试图了解一下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) 我在理解changeset模型时遇到问题.它能做什么?我们可以在一个模型中拥有多个变更集吗?例如一个用于创建,另一个用于更新.
有人可以用简单的方式详细说明,这样可以帮助其他人来凤凰城.
我想断言列表的大小.目前我这样做如下:
assert devices = Repo.all from d in device, where d.uuid == ^attrs.uuid
assert devices.first == devices.last
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?