Ruby 中 GraphQL 类型的字段定义中感叹号的目的是啥?
Posted
技术标签:
【中文标题】Ruby 中 GraphQL 类型的字段定义中感叹号的目的是啥?【英文标题】:What is the purpose of exclamation marks in field definitions for GraphQL types in Ruby?Ruby 中 GraphQL 类型的字段定义中感叹号的目的是什么? 【发布时间】:2019-05-06 00:25:56 【问题描述】:我正在关注this guide 学习带有Ruby后端的GraphQL,在“查询返回链接”部分,有以下代码:
# defines a new GraphQL type
Types::LinkType = GraphQL::ObjectType.define do
# this type is named `Link`
name 'Link'
# it has the following fields
field :id, !types.ID
field :url, !types.String
field :description, !types.String
end
我知道感叹号只是一个“非”运算符,但有人可以在这里解释一下它的用途吗?
【问题讨论】:
【参考方案1】:这是一个必填(不可为空)字段。实施:
字符串!表示该字段不可为空,这意味着 GraphQL 服务承诺在您查询该字段时始终为您提供一个值。在类型语言中,我们将用感叹号表示。
https://graphql.org/learn/schema/#object-types-and-fields
好像被关键字语法取代了:
field :handle, String, null: false
http://graphql-ruby.org/type_definitions/objects.html
【讨论】:
那么感叹号在类型之前还是之后没有关系吗?阅读本文档,所有不可为空的值都由它跟随,而不是在它之前:GraphQL Ruby - Non-Null Types - 而在this documentation 中,它用于在类型之前,但没有解释......? 在 Ruby graphql DSL 中,它位于类型之前,因为它使用了重载运算符 -!(types.String)
。它在 graphql 模式定义中映射到 types.String!
。它 types.String!
被使用,它会被视为类型名称的一部分:String!
太好了,谢谢!在您的帮助下,我找到了this documentation,它指出它现在已被删除,以避免与内置逻辑运算符产生歧义。
当然可以! :)【参考方案2】:
“!” GraphQL 中的标记指定该字段不可为空。在您的示例中,id、url、description 字段都不能为 NULL。
field :id, !types.ID
field :url, !types.String
field :description, !types.String
如果在列表中使用,它的含义会略有不同。
[整数]! :列表不能为NULL。如果您传递“null”,那将是一个错误,而“[1, 2, null]”是可以接受的。 [Int!] : 列表内容不能为 NULL。它将接受“null”列表,但“[1, 2, null]”会导致错误。
【讨论】:
以上是关于Ruby 中 GraphQL 类型的字段定义中感叹号的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章