我正在使用'-Woverspecs‘运行Dialyzer,并收到以下警告:
room_channel.ex:143:
Type specification 'Elixir.Backend.RoomChannel':
testU(a) -> a when is_subtype(a,#{})
is a subtype of the success typing: 'Elixir.Backend.RoomChannel':testU(_) -> any()
使用以下代码:
@spec testU( a ) :: a when a: %Backend
我读过Mkyong的这个伟大的关于Hibernate中一对多关系的文章,我对此有很大的怀疑。Mkyong在他的示例中使用了两个clase:Stock.java and StockDailyRecord.java
我认为类图必须是:“股票有许多库存透析记录”,因此,作为数据库实体关系图,必须是:“库存一对多的库存透析记录”。
但是Mkyong已经走得更远了,这里是我怀疑的地方。他设置了一个名为Stock stock on the StockDialyRecords class的属性。也就是说,他创造了一个的双向关系。这是对的?我知道这条路对ORM来说,我们可以朝两个方向走。但从图类来看,的观点是
在Elixir中,我如何记录一个函数将返回一个实现特定行为的模块?
举个简单的例子,假设我创建了一个由两个模块实现的GreeterBehaviour行为:
defmodule GreeterBehaviour do
@callback say_hello(String.t) :: String.t
end
defmodule FormalGreeter do
@behaviour GreeterBehaviour
def say_hello(name) do
"Good day to you #{name}"
end
end
defmodule C
我正在使用药剂,我得到了一个透析器(通过透析)的错误,上面写着
The pattern
variableVdate
can never match, because previous clauses completely cover the type
{:error, :badarg}.
这是代码
date = Timex.DateTime.from_seconds(0)
case date do
{:error, :badarg} ->
{:error, "Bad Date"}
date ->
{:ok, date}
end
我相信这
静态分析器透析器(我通过使用它)将Logger (Logger.info "blah")的所有使用情况报告为无与伦比的返回:
Expression produces a value of type 'ok' | {'error',_}, but this value is unmatched
我可以编写:ok = Logger.info "blah",但很明显,它很麻烦。我还可以使用-Wno_unmatched_returns配置透析器,以忽略所有这些警告。然而,我发现它们信息丰富,不想忽视它们。
说,我们可以在每个模块的基础上
在长生不老药中可以参数化Enumerable.t类型吗?
因此,目前我有一个函数,它接受foos的列表:
@spec the_awesome([foo]) :: any
def the awesome(foos) do
Enum.reduce(foos, &(bar(&2, &1)))
end
事实上,它不一定非得是一个列表!由于唯一的函数调用来自Enum模块,所以我想更改类型foo以接受任何可枚举的类型,但是保留这样的要求:枚举必须完全由foo的
有点像
@spec the_awesome(Enumerable.t(foo)) :: any
这个是可能的吗?
下面有一个简单的代码来测试Erlang如何处理异常。抛出和捕获的引用。
-module(exception).
-export([sum/2]).
-export([is_odd/1]).
sum(A, B) ->
case is_odd(A) of
odd ->
2*A+B;
Result ->
Result
end.
is_odd(A) ->
case is_integer(A) of
true ->
odd;
_ -> ****({error,
Dialyzer指责试图与模块变量匹配的代码:
defmodule Main do
# -> :demo
@env Application.get_env(:myproject, :env)
def run do
case @env do
:production -> 1
_ -> 2
end
end
end
lib/myproject/main.ex:6:pattern_match
The pattern can never match the type.
Pattern:
:production
Type:
:
我正在使用透析器修复Erlang代码中的错误。
io:format(IoDevice, "[]");
这一行会产生以下错误:
The call io:format(IoDevice::pid(),[91 | 93,...])
will never return since the success typing is
(atom() | binary() | string(),[any()]) -> 'ok'
and the contract is (Format,Data) -> 'ok'
when Format
一个简单的程序产生两种透析器警告:
defmodule Dtest do
defprotocol Valid do
@doc "Returns true if data is in a valid state"
def valid?(data)
end
defimpl Valid, for: Integer do
def valid?(_), do: true
end
end
我不明白的警告是:
dtest.ex:2: The specification for
'Elixir.Dtest.Valid':'__p
我在/lib/mix/ Mix.Task /start.ex中为我的项目创建了新的
defmodule Mix.Tasks.Start do
use Mix.Task
def run(_), do: IO.puts("Hello, World!")
end
现在,它可以从这样的控制台运行:
mix start
但是我得到了透析器的错误,那个Callback info about the 'Elixir.Mix.Task' behaviour is not available。这意味着什么,以及如何解决这个问题?