elixir在1.2后增加了一个新的特性i helper. 在iex shell中使用i可以查看任意数据的数据类型和详细描述
#查看变量描述
iex(1)> i {:test, "That sounds great"}
Term
{:test, "That sounds great"}
Data type
Tuple
Reference modules
Tuple
#查看Module描述(有点类似于Erlang的lists:module_info)
iex(2)> i List
Term
List
Data type
Atom
Module bytecode
usr/local/Cellar/elixir/1.2.0/bin/../lib/elixir/ebin/Elixir.List.beam
Source
private/tmp/elixir20160101-48495-1fg1arr/elixir-1.2.0/lib/elixir/lib/list.ex
Version
[322093417650371381585336045669056703278]
Compile time
2016-1-1 11:57:45
Compile options
[:debug_info]
Description
Use h(List) to access its documentation.
Call List.module_info() to access metadata.
Raw representation
:"Elixir.List"
Reference modules
Module, Atom
来看看这么神奇的功能是怎么实现的吧~

  @doc """
Prints information about the given data type.
"""
def i(term) do
info = ["Term": inspect(term)] ++ IEx.Info.info(term) for {subject, info} <- info do
info = info |> to_string() |> String.strip() |> String.replace("\n", "\n ")
IO.puts IEx.color(:eval_result, to_string(subject))
IO.puts IEx.color(:eval_info, " #{info}")
end dont_display_result
end
可以看出它只是把IEx.info.info的结果打出来,我们再看看它发生了什么?
defprotocol IEx.Info do
@fallback_to_any true @spec info(term) :: [{atom, String.t}]
def info(term)
end defimpl IEx.Info, for: Tuple do
def info(_tuple) do
["Data type": "Tuple",
"Reference modules": "Tuple"]
end
end

它是一个protocol,在这个文件中把elixir的基本类型都实现了一次,它会返回一个keyword list, 所以我们才能看到,那么如果我们试试自己定义?

iex(3)> defmodule User do
…(3)> defstruct name: "John", age: 25
…(3)> @type t :: %User{name: String.t, age: non_neg_integer}
…(3)> end

因为在info.ex中已处理struct的类型, 如果我们现在直接i的结果它是

iex(4)> i %User{}
Term
%User{age: 25, name: "John"}
Data type
User
Description
This is a struct. Structs are maps with a __struct__ key.
Reference modules
User, Map

接下来, 我们来自定义看看

iex(5)> defimpl IEx.Info, for: User do
…(5)> def info(item) do
…(5)> ["Data type": User, "Description": "The customer is god, pleasure they", "Reference": "blablabla..."]
…(5)> end
…(5)> end
iex(6)> i %User{}
Term
%User{age: 25, name: "John"}
Data type
Elixir.User
Description
The customer is god, pleasure they
Reference
blablabla...

成功!

官方文档: http://elixir-lang.org/docs/stable/iex/IEx.Helpers.html#i/1

彩蛋:

有没有看到我们输入i得到的结果,只是把格式用有颜色的格式打印出来,但是确没有看到返回值被打印出来。。。

它的结果无论如何都打印不出来滴。因为它调用了

IEx.dont_display_result

在 evaluator.ex 里面:

 unless result == IEx.dont_display_result, do: io_inspect(result)

if my fingers were erlang processes

[Elixir005] 查看指定数据的详细信息 i helper的更多相关文章

  1. asp.net/wingtip/显示数据和详细信息

    前边我们的工作处于wingtip工程基础建设阶段,先是建立了“数据访问层”,然后设计建设了“UI和导航”的框架,接下来要充实工程的内容,显示“数据和详细信息”. 一. 添加数据控件(Data Cont ...

  2. 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?

    1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...

  3. 使用tcpdump查看HTTP请求响应 详细信息 数据

    安装tcpdump: sudo yum install tcpdump 查看get请求: tcpdump -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] &a ...

  4. 【数据库】】MySQL之desc查看表结构的详细信息

    在mysql中如果想要查看表的定义的话:有如下方式可供选择 1.show create table 语句: show create table table_name; 2.desc table_nam ...

  5. MySQL之desc查看表结构的详细信息

    在mysql中如果想要查看表的定义的话:有如下方式可供选择 1.show create table 语句: show create table table_name; 2.desc table_nam ...

  6. Python查看模块函数,查看函数方法的详细信息

    Python查看方法的详情 1.通用的帮助函数help() 使用help()函数来查看函数的帮助信息. 如: import requests help(requests) 会有类似如下输出: 2.查询 ...

  7. 查看mssql死锁的详细信息(存储过程)

    CREATE  procedure [dbo].[sp_who_lock]asbegindeclare @spid int,@bl int,        @intTransactionCountOn ...

  8. docker查看容器元数据、详细信息,查看容器挂载的目录

    通过 docker inspect 175f 查看容器元数据 我们启动docker的时候会挂载目录,但是挂载之后 后面就忘了 如何查看挂载的目录位置呢 可以通过 docker inspect a7a6 ...

  9. linux下如何查看某个容器的详细信息?

    答: 使用docker inspect <CONTAINER ID>即可

随机推荐

  1. javascript的propertyIsEnumerable()方法

    /* propertyIsEnumerable()是用来检测属性是否属于某个对象的,如果检测到了,返回true,否则返回false. 1.这个属性必须属于实例的,并且不属于原型. 2.这个属性必须是可 ...

  2. C# 窗体常用API函数 应用程序窗体查找

    常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名 ...

  3. leetcode205

    public class Solution { public bool IsIsomorphic(string s, string t) { if (s.Length != t.Length) { r ...

  4. 1.Ehcache(01)——简介、基本操作

    转自:https://blog.csdn.net/w1014074794/article/details/51086228 Ehcache简介 目录 1       CacheManager 1.1  ...

  5. linux学习(别人指出来的), 回头有针对性的学下!

    应该是 会linux 基本操作吧linux 安装 lamp lnmp php拓展这些基本都得会把知道subversion 和 github 这俩吧windows的代码同步到linux上无需ftp 会跟 ...

  6. es6 class 了解

    ES6之class ES5中通常通过构造函数和原型的组合形式来创建对象.在ES6中引入class作为对象模板, Class定义语法 class point{ constructor(x,y){ thi ...

  7. rook

    https://github.com/rook/rook https://rook.github.io/docs/rook/master/ Rook是在云本地环境中运行的分布式存储系统的开源编排器. ...

  8. cas增加验证码

    参考地址:https://blog.csdn.net/attackmind/article/details/52052502 参考地址:https://blog.csdn.net/jadyer/art ...

  9. 更改Mysql数据库数据存储位置的具体步骤

    首先把mysql的服务先停掉,更改MySQL配置文件My.ini中的数据库存储主路径,将老的数据库存储主路径中的数据库文件和文件夹复制到新的存储主路径,接下来重启搞定. 一.首先把mysql的服务先停 ...

  10. store下载文件保存位置

    PC:C:\Users\accountName\AppData\Roaming\Unity\Asset Store MAC:"~/Library/Unity/Asset"