codecamp

Elixir 自定义印记

正如本章开始时提到的,Elixir中的印记也具有扩展性.事实上,使用印记~r/foo/i相当于使用一个二进制数和一个字符列表作为参数调用sigil_r:
iex> sigil_r(<<"foo">>, 'i')
~r"foo"i

我们可以通过sigil_r获取~r印记的文档:

iex> h sigil_r
...

我们也可以简单地在sigil_{identifier}模式之后添加需要实现的函数来自定义我们的印记.例如,让我们用~i印记来返回一个整数(使用修饰符n可以将其变为负数):

iex> defmodule MySigils do
...>   def sigil_i(string, []), do: String.to_integer(string)
...>   def sigil_i(string, [?n]), do: -String.to_integer(string)
...> end
iex> import MySigils
iex> ~i(13)
13
iex> ~i(42)n
-42

印记也可以在宏的帮助下进行编译时工作.例如,在编译源代码时,Elixir中的正则表达式会被编译成一个高效的表示方法,在运行时就可以跳过此步骤.如果你对此感兴趣,我们建议你学习宏的知识,并了解印记是如何在Kernel模块中被实现的(sigil_*函数就是在那里定义的).


Elixir 印记的插值与逃避
Elixir 错误
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Elixir 基本操作符

Elixir 二进制,字符串和字符列表

Elixir 类型规格与行为

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }