1

~s

字符串转义

iex(65)> ~s(this is a string with "double" quotes, not 'single' ones)
"this is a string with \"double\" quotes, not 'single' ones"

有时候你自己手工转义可能会产生引号不配对的问题, 这个魔术符号帮组你避免一些转义上的错误.

大写的-S, 一般用于编写文档, 支持多行文本

@doc ~S"""
Converts double-quotes to single-quotes.
## Examples

    iex> convert("\"foo\"")
    "'foo'"

"""

~c

字符列表

iex(66)> ~c(this is a char list containing 'single quotes')
'this is a char list containing \'single quotes\''

~w

单词列表, 用于构造列表, 支持三种修饰符 a(atom), c(char), s(string)

iex(68)> ~w(name mail tel)a
[:name, :mail, :tel]

iex(69)> ~w(name mail tel)s
["name", "mail", "tel"]

iex(70)> ~w(name mail tel)c
['name', 'mail', 'tel']

作为一种构造列表的语法糖, 它可以帮助你节省很多字符的输入.

最后

Erlang默认现在是UTF-8编码, 因此魔术符号是支持中文的, 下面来个有用点的例子, 用于随机生成百家姓:

family_names.exs

defmodule FamilyNames do
  require Logger
  def main do
    family_names = ~w(
      赵 钱 孙 李 周 吴 郑 王 冯 陈 褚 卫 蒋 沈 韩 杨 朱 秦 尤 许
      何 吕 施 张 孔 曹 严 华 金 魏 陶 姜 戚 谢 邹 喻 柏 水 窦 章
      云 苏 潘 葛 奚 范 彭 郎 鲁 韦 昌 马 苗 凤 花 方 俞 任 袁 柳
      酆 鲍 史 唐 费 廉 岑 薛 雷 贺 倪 汤 滕 殷 罗 毕 郝 邬 安 常
      乐 于 时 傅 皮 卞 齐 康 伍 余 元 卜 顾 孟 平 黄 和 穆 萧 尹
      姚 邵 湛 汪 祁 毛 禹 狄 米 贝 明 臧 计 伏 成 戴 谈 宋 茅 庞
      熊 纪 舒 屈 项 祝 董 粱 杜 阮 蓝 闵 席 季 麻 强 贾 路 娄 危
      江 童 颜 郭 梅 盛 林 刁 钟 徐 邱 骆 高 夏 蔡 田 樊 胡 凌 霍
      虞 万 支 柯 昝 管 卢 莫 经 房 裘 缪 干 解 应 宗 丁 宣 贲 邓
      郁 单 杭 洪 包 诸 左 石 崔 吉 钮 龚 程 嵇 邢 滑 裴 陆 荣 翁
      荀 羊 於 惠 甄 麴 家 封 芮 羿 储 靳 汲 邴 糜 松 井 段 富 巫
      乌 焦 巴 弓 牧 隗 山 谷 车 侯 宓 蓬 全 郗 班 仰 秋 仲 伊 宫
      宁 仇 栾 暴 甘 钭 厉 戎 祖 武 符 刘 景 詹 束 龙 叶 幸 司 韶
      郜 黎 蓟 薄 印 宿 白 怀 蒲 邰 从 鄂 索 咸 籍 赖 卓 蔺 屠 蒙
      池 乔 阴 欎 胥 能 苍 双 闻 莘 党 翟 谭 贡 劳 逄 姬 申 扶 堵
      冉 宰 郦 雍 舄 璩 桑 桂 濮 牛 寿 通 边 扈 燕 冀 郏 浦 尚 农
      温 别 庄 晏 柴 瞿 阎 充 慕 连 茹 习 宦 艾 鱼 容 向 古 易 慎
      戈 廖 庾 终 暨 居 衡 步 都 耿 满 弘 匡 国 文 寇 广 禄 阙 东
      殴 殳 沃 利 蔚 越 夔 隆 师 巩 厍 聂 晁 勾 敖 融 冷 訾 辛 阚
      那 简 饶 空 曾 毋 沙 乜 养 鞠 须 丰 巢 关 蒯 相 查 後 荆 红
      游 竺 权 逯 盖 益 桓 公 万俟 司马 上官 欧阳 夏侯 诸葛
      闻人 东方 赫连 皇甫 尉迟 公羊 澹台 公冶 宗政 濮阳
      淳于 单于 太叔 申屠 公孙 仲孙 轩辕 令狐 钟离 宇文
      长孙 慕容 鲜于 闾丘 司徒 司空 亓官 司寇 仉 督 子车
      颛孙 端木 巫马 公西 漆雕 乐正 壤驷 公良 拓跋 夹谷
      宰父 谷梁 晋 楚 闫 法 汝 鄢 涂 钦 段干 百里 东郭 南门
      呼延 归 海 羊舌 微生 岳 帅 缑 亢 况 后 有 琴 梁丘 左丘
      东门 西门 商 牟 佘 佴 伯 赏 南宫 墨 哈 谯 笪 年 爱 阳 佟
      第五 言 福
    )
    len = :erlang.length(family_names)
    index = :rand.uniform(len)
    family_name = :lists.nth(index, family_names)
    Logger.info family_name
  end
end
FamilyNames.main

下面的erlang手册中的说明:

nth(N, List) -> Elem

Types:

    N = integer() >= 1
        1..length(List)
    List = [T, ...]
    Elem = T
    T = term()

Returns the Nth element of List. For example:    

> lists:nth(3, [a, b, c, d, e]).
c

从中, 可以看出 :lists.nth/2 的第一个参数是从1开始的, 这点需要注意.


developerworks
1.7k 声望266 粉丝