什么是语法类型?
显式语法类型化是使用语法来指定某些数据的类型。这是大多数编程语言设计的一个特征。
x = "11" # this is a string
y = 11 # this isn't
它并不局限于编程语言。它是像 JSON 这样的序列化格式的常见特征
{"x": "11", "y": 42}
但不是其他格式,比如 INI
server=192.0.2.62
port=143
或 CSV
server,port
192.0.2.62,143
或 StrictYAML
server: 192.0.2.62
port: 143
在这些情况下,由程序(在另一个文件中)决定该数据的一部分是什么,以及哪一部分是整数。
将语法类型附加到数据意味着什么?
语法类型化是明确优先考虑内聚性而不是简洁性。它将类型信息直接放在数据旁边,但这意味着如果数据很多
你什么时候会牺牲简洁性?
让我们回到 Python 一秒钟,想象一下
x = "11" # this is a string
y = 11 # this isn't
这有助于区分解析器的类型,这对 JSON 很有用,但它也带来了两个缺点
- 这种区别很微妙,对于非程序员来说不太清楚,他们不一定理解需要向解析器发出指令以避免误解。
- 如果类型结构在标记之外维护,则不需要它。
- 冗长 - 每个字符串增加两个字符会使标记更长、更嘈杂。
在 JSON 作为 REST API 使用时,语法类型化通常是一个优势 - 它明确地告诉读取 JSON 的机器,“string” 和“age” 是一个整数,它可以在没有模式的情况下进行相应的转换。
StrictYAML 假设所有值都是字符串,除非模式明确指示其他情况(例如 Map(Int(), Int()))。
StrictYAML 不需要对隐式转换为其他类型的字符串(例如 yes 或 1.5)使用引号,但它需要对语法上令人困惑的字符串使用引号(例如 “{ 大括号内的文本 }”)
标准 YAML 具有显式语法类型化来明确声明字符串,尽管很难确定何时需要它以及何时不需要它。例如
a: text # not necessary
b: "yes" # necessary
c: "0" # necessary
d: "3.5" # necessary
e: in # not necessary
f: out # not necessary
g: shake it all about # not necessary
h: "on" # necessary
大多数其他配置语言格式也使用语法类型化。例如
INI 却没有显式语法类型化。