跳至内容

什么是语法类型?

显式语法类型化是使用语法来指定某些数据的类型。这是大多数编程语言设计的一个特征。

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 却没有显式语法类型化。