Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查Elixir中的变量类型_Elixir - Fatal编程技术网

如何检查Elixir中的变量类型

如何检查Elixir中的变量类型,elixir,Elixir,在Elixir中,如何检查Python中的类型: >>> a = "test" >>> type(a) <type 'str'> >>> b =10 >>> type(b) <type 'int'> >a=“测试” >>>类型(a) >>>b=10 >>>类型(b) 我在Elixir中读到过一些类型检查器,如“is_bitstring”、“is_float”、“is_list”、“is_map”等

在Elixir中,如何检查Python中的类型:

>>> a = "test"
>>> type(a)
<type 'str'>
>>> b =10
>>> type(b)
<type 'int'>
>a=“测试”
>>>类型(a)
>>>b=10
>>>类型(b)

我在Elixir中读到过一些类型检查器,如“is_bitstring”、“is_float”、“is_list”、“is_map”等,但是如果您不知道类型可能是什么呢?

在Elixir/Erlang中无法直接获取变量的类型

你通常想知道一个变量的类型,以便采取相应的行动;您可以使用
is.*
函数根据变量的类型进行操作

了解Erlang关于在Erlang中键入内容的一些知识(从而了解Elixir)

使用
最惯用的方法是*
函数族可能是在模式匹配中使用它们:

def my_fun(arg) when is_map(arg), do: ...
def my_fun(arg) when is_list(arg), do: ...
def my_fun(arg) when is_integer(arg), do: ...
# ...and so on

从elixir 1.2开始,iex中有一个
i
命令,它将列出任何elixir变量的类型和更多

iex> foo = "a string" 
iex> i foo 
Term
 "a string"
Data type
 BitString
Byte size
 8
Description
 This is a string: a UTF-8 encoded binary. It's printed surrounded by
 "double quotes" because all UTF-8 encoded codepoints in it are        printable.
Raw representation
  <<97, 32, 115, 116, 114, 105, 110, 103>>
Reference modules
  String, :binary
iex>foo=“字符串”
iex>i-foo
学期
“字符串”
数据类型
位串
字节大小
8.
描述
这是一个字符串:UTF-8编码的二进制文件。它的四周都是印刷品
“双引号”,因为其中所有UTF-8编码的代码点都是可打印的。
原始表示
参考模块
字符串,:二进制
如果查看
i
命令的代码,您将看到这是通过协议实现的


如果您想为Elixir中的任何数据类型实现一个函数,方法是为您希望该函数处理的所有数据类型定义一个协议和协议的实现。不幸的是,您不能在guards中使用协议函数。然而,一个简单的“类型”协议很容易实现

另一种方法是使用模式匹配。假设您使用的是Timex,它使用的是
%DateTime{}
结构,您希望查看元素是否为一个。您可以在方法中使用模式匹配查找匹配

def is_a_datetime?(%DateTime{}) do
  true
end

def is_a_datetime?(_) do
  false
end

我把这个留在这里,希望有人能想出一个真正理智的版本。目前在谷歌上还没有很好的答案

defmodule Util do
def类型(自我)do
康多
是浮动(自身)->“浮动”
是_编号(self)->“编号”
是原子(自身)->“原子”
是布尔值(自身)->“布尔值”
是二进制(self)->“二进制”
is_函数(自身)->“函数”
是列表(自我)->“列表”
是元组(self)->“元组”
正确->“idunno”
结束
结束
结束
为了完整性,测试用例:

案例=[
1.337, 
1337, 
:'1337', 
是的,
, 
(fn(x)->x端),
{1, 3, 3, 7}
]
枚举每个案例,fn(案例)->
IO.puts(检查案例)“是”(Util.typeof案例)
结束
这里有一个协议解决方案;我不确定它们是否更快(我当然希望它们不会对所有类型进行循环),但它非常难看(而且很脆弱;如果它们添加或删除基本类型或重命名,它将破坏它)

defprotocol-Typeable,do:def-typeof(self)
dempl-Typeable,for:Atom,do:def-typeof(u),do:“Atom”
dempl Typeable,for:BitString,do:def typeof(u),do:“BitString”
dempl Typeable,for:Float,do:def typeof(_),do:“Float”
可定义类型,for:Function,do:def typeof(u),do:“Function”
dempl Typeable,for:Integer,do:def typeof(u),do:“Integer”
可定义类型,for:List,do:def typeof(u),do:“List”
dempl Typeable,for:Map,do:def typeof(u),do:“Map”
可定义类型,for:PID,do:def-typeof(u),do:PID
dempl Typeable,for:Port,do:def typeof(u),do:“Port”
可定义类型,for:Reference,do:def typeof(u),do:“Reference”
dempl-Typeable,for:Tuple,do:def-typeof(u),do:“Tuple”
IO.puts可键入。键入“Hi”
IO.puts可输入。类型:好的

我只是从以下位置粘贴代码:)

defmodule Util do
types=~w[函数nil整数二进制位字符串列表映射浮点原子元组pid端口引用]

对于类型,也出于调试目的,如果您不在iex中,可以直接调用它:

IEx.Info.info(5)
=> ["Data type": "Integer", "Reference modules": "Integer"]

我遇到了一个需要检查的情况,参数需要是某种类型。也许可以用一种更好的方式

像这样:

@required [{"body", "binary"},{"fee", "integer"}, ...]
defp match_desire?({value, type}) do
  apply(Kernel, :"is_#{type}", [value])
end
用法:

Enum.map(@required, &(match_desire?/1))

就因为没人提过

IO.inspect/1

控制台对象的输出。。。它几乎等同于JSON.stringify


当您一生都无法在测试中找出对象的外观时,这非常有用。

Erlang/Elixir真的没有存储的类型信息吗?我真的需要在现有类型上创建一个全新的包装器才能使语言可用吗?O。o@Dmitry你说可用是什么意思?我可以看一个具体的例子吗?在这个例子中,您可以使用类似于
typeof(variable)
的结果吗?当程序离开编译时进入运行时,有关某个对象的所有信息都会丢失。当我想检查一个正在运行的程序的信息时,知道发生了什么的唯一方法是通过检查通过地图网络公开的东西。如果类型信息不可用,并且我想检查类型,那么分析对象以获取其“类型”的成本要比该类型已经公开的成本高得多。typeof允许我们分析正在运行的系统,并在运行时以允许类型检查和多态性的方式对其进行扩展;typeof最有用的用途是能够直接将[type string,function]的哈希表映射到未知项列表上。例如无法使用code
Enum.map(foo,fn(x)->IO.puts x end)
将IO.puts映射到
foo=[1,“hello”、[1,2,3]
,因为[1,2,3]将被读取为字符(为什么是erlang!!?),并将显示一堆笑脸(试试!)。因此,我们被迫使用inspect,即使inspect仅在它是一个列表时才需要,否则大多数时候我们不需要它。typeof让我们把if语句(O(n))转换成dictiona