能否输出带颜色的Elixir术语?如何复用iex着色功能?
关于Elixir着色输出的疑问解答
嘿,这几个问题问得很实在!我来给你逐一拆解清楚:
1. 能不能输出带颜色的Elixir术语?
当然可以!Elixir原生支持通过ANSI转义码实现文本着色,不过直接写转义码太繁琐。好在官方已经帮我们封装了更易用的方式,不用自己拼那些晦涩的代码。
2. 自定义程序里能不能复用iex的美观着色?
完全没问题!iex的着色逻辑并不是iex独有的,它依赖的是Elixir标准库中的Inspect协议和IEx模块里的配置。你可以直接在自己的程序里调用相关函数,复用这套成熟的着色规则。
3. 有没有类似IO.color_inspect的功能?
虽然标准库没有直接叫IO.color_inspect的函数,但我们可以轻松实现类似的效果,甚至直接用现成的工具达成目的:
直接用IEx.inspect实现着色
IEx.inspect/2默认就会使用和iex控制台一样的着色风格输出,比如:
# 输出带颜色的映射结构,还可以添加标签方便识别 IEx.inspect(%{username: "roger", role: :admin}, label: "Current User")
自定义着色规则
如果你想调整颜色,还可以通过:colors选项自定义不同类型术语的颜色:
# 指定数字为蓝色,原子为黄色,字符串为绿色 IO.inspect([42, :success, "hello world"], opts: [ colors: [number: :blue, atom: :yellow, string: :green] ])
封装自己的color_inspect函数
要是你习惯了IO.color_inspect的命名,也可以自己封装一个极简版本:
defmodule Utils do def color_inspect(term, opts \\ []) do # 复用iex的默认颜色配置,也可以传入自定义colors覆盖 default_colors = IEx.configure()[:colors] inspect_opts = Keyword.merge([colors: default_colors], opts) formatted = inspect(term, inspect_opts) IO.puts(formatted) term # 和IO.inspect一样,返回原术语方便链式调用 end end # 调用试试 Utils.color_inspect(%{a: 1, b: :two})
最后补充一句:只要你的终端支持ANSI颜色(大部分现代终端都支持),这些着色就能正常显示;如果终端不支持,Elixir会自动忽略颜色代码,不会出现乱码,兼容性很友好。
内容的提问来源于stack exchange,提问作者Roger Lipscombe
相关产品推荐
相关产品推荐

