我正在阅读编程凤凰书,我想知道def和之间的区别是什么defp.
我的控制器中有几个功能 - 大多数都是这样的动作:
def new (conn, _params) do
...
end
Run Code Online (Sandbox Code Playgroud)
这本书让我在这个控制器中创建另一个函数,这不是典型的控制器动作,如下所示:
defp user_videos(user) do
...
end
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如何在Phoenix Framework中的控制器内定义函数defp时知道何时使用以及何时使用def.
我们将使用Clojure编写并发程序,该程序将从大量传入邮件中提取关键字,这些邮件将与数据库进行交叉检查.
我的一个队友建议使用Erlang编写这个程序.
在这里,我想要注意一些我对函数式编程不熟悉的东西,所以我有点怀疑clojure是编写这个程序的好选择,还是Erlang更适合.
在Elixir中,您可以获得字符串的md5:
ex(1)> :crypto.hash(:md5 , "Elixir") |> Base.encode16()
"A12EB062ECA9D1E6C69FCF8B603787C3"
Run Code Online (Sandbox Code Playgroud)
但为什么不从终端返回相同的值?
[~ ~]$echo 'Elixir' | md5
694f56f4b30e60837151723777795fc2
Run Code Online (Sandbox Code Playgroud)
当然我错过了什么.
我需要从Java访问编号的文件描述符 - 除了0,1或2.
如何才能做到这一点?我查看了FileDescriptor类,但没有找到任何方法用给定的文件描述符编号初始化它.
作为一个具体的例子,假设Java被另一个编程语言作为子进程调用.文件描述符3和4由另一种语言提供,用于输入和输出.
我需要的是Java InputStream和OutputStream连接到这些文件描述符的对象,就像System.in,System.out和System.error连接到文件解析器0,1和2一样.
我正在使用Java 1.6,这应该在类似Unix的系统上运行.
经过测试的工作方案:
文件描述符特殊文件系统条目的答案确实指向了以下可行的解决方案:
找出你的Unix系统是否以及在哪里有一个包含所有文件描述符的命名条目的特殊文件系统.
确保已安装此文件系统
FreeBSD的:把fdescfs /dev/fd fdescfs rw 0 0在/etc/fstab
或者mount -t fdescfs null /dev/fd在shell提示符下运行(可能带有sudo)
使用new FileInputStream("/dev/fd/3")并new FileOutputStream("/dev/fd/4")获取连接到filedescriptors的流(路径适用于FreeBSD,替换为您的操作系统路径)
接收事件时,Akka Actors将一次处理一条消息,阻塞直到请求完成,然后再转到下一条消息.
这适用于同步/阻塞任务,但是如果我想执行异步/非阻塞请求,Akka将继续处理而无需等待任务完成.
例如:
def doThing():Future[Unit] = /* Non blocking request here */
def receive = {
case DoThing => doThing() pipeTo sender
}
Run Code Online (Sandbox Code Playgroud)
这将调用doThing()并开始处理未来,但在处理下一条消息之前不会等待它完成 - 它将尽可能快地执行队列中的下一条消息.
实质上,似乎Akka认为"返回未来"是"完成处理"并转移到下一条消息.
为了一次处理一条消息,似乎我需要主动阻止Actor线程来阻止它这样做
def receive = {
case DoThing => sender ! blocking(Await.result(doThing()))
}
Run Code Online (Sandbox Code Playgroud)
这感觉就像一个非常错误的方法 - 它是人为地阻塞代码中的一个线程,否则它应该是完全无阻塞的.
当将Akka与Elixir演员比较时,我们可以通过使用尾调用来请求下一条消息而不需要人为阻塞来轻松避免这个问题.
在Akka还有什么办法吗?
a)等待a Future完成,然后处理下一条消息而不阻塞线程.
b)使用显式尾调用或其他一些机制来使用基于拉的工作流而不是基于推送?
这开始是一个问题:
几乎每次我使用Erlang shell时,我都想在shell启动时运行一些命令,例如
rr("*.hrl").
Run Code Online (Sandbox Code Playgroud)
或类似的.目前我必须在每次启动Erlang shell时键入它,我已经厌倦了它并且一直忘记它.
但这实际上是错误的问题!我真正想要做的是在每个shell作业中读取我的记录定义标题.不能用于启动时运行的其他shell内置命令.所以我更改了问题标题以显示它应该如何询问的问题.
我试图在Elixir项目中使用Erlang库时遇到一个小问题.有问题的库是erl8583ISO-8583消息打包和解包.
我找到了一个github存储库erl8583,并将我调整mix.exs为以下内容:
defmodule Iso.Mixfile do
use Mix.Project
def project do
[app: :iso,
version: "0.0.1",
elixir: "~> 1.0",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps]
end
def application do
[applications: [:logger]]
end
defp deps do
[{:erl8583, github: "mgwidmann/erl8583"}]
end
end
Run Code Online (Sandbox Code Playgroud)
当我运行mix deps.get和mix deps.compile,它运行平稳.
然后,我尝试启动IEx会话iex -S mix,并收到以下错误:
Unchecked dependencies for environment dev:
* erl8583 (git://github.com/mgwidmann/erl8583.git)
could not find an app file at _build/dev/lib/erl8583/ebin/erl8583.app. This may happen if …Run Code Online (Sandbox Code Playgroud) 在我所见过的所有Erlang主管示例中,通常都有一个"主"主管监督整个树(或者至少是主管树中的根节点).如果"主人" - 监督员破裂怎么办?如何监督"主人"监督?任何典型的模式?
我想知道是否有一种方法可以从Elixir中获取命令行中的绝对光标位置.
我知道我必须使用以下ansi转义序列\ 033 [6n,执行后:
echo -en "\033[6n"
Run Code Online (Sandbox Code Playgroud)
打印正是我正在寻找的,但我不知道如何从Elixir得到命令响应.
谢谢!
我一直在网上寻找Erlang程序的各种打字实践,似乎有一些...虽然有点难以找到一个坚实的信息来源,即我正在寻找实用信息:
1. -specs- 这个看起来很有吸引力.一些地方提到在编译时检查具有相关的-specs指令的函数(为了正确的类型用法)...我似乎无法找到更多关于如何使用它的信息(使用哪种工具 - Dialyzer, TYPER?).我真的很想创建一个小的解析器/代码生成器,它将从表单的函数声明中生成这些"规范"
functionName(param1 :List, param2 :Tuple) -> ...
Run Code Online (Sandbox Code Playgroud)
我还没有看到是否-spec支持抽象类型(用户声明的类型 - "汽车"类型 -
{car,{weight,_},{height,_},{maxSpeed,_}}
Run Code Online (Sandbox Code Playgroud)
2. 这里提到的-deftype指令
如果我可以开始输入内容并在编译时检查它们,那么Erlang对我来说会变得如此强大.上面提到的解析器/代码生成器的运行时将在输出源代码中生成防护类型检查.
elixir ×4
erlang ×4
actor ×1
akka ×1
clojure ×1
concurrency ×1
erl ×1
erlang-shell ×1
file-io ×1
freebsd ×1
java ×1
scala ×1
type-systems ×1