天道酬勤,学无止境

grpc/protobuffer ask for specific fields

GraphQL lets you ask for specific fields, the response contains only the fields that you had asked for. For example: a graphql query like:

{
  hero {
    name
  }
}

will return:

{
  "data": {
    "hero": {
      "name": "R2-D2"
    }
  }
}

where as a graphQl query like:

{
  hero {
    name
    
    friends {
      name
    }
  }
}

would return:

{
  "data": {
    "hero": {
      "name": "R2-D2",
      "friends": [
        {
          "name": "Luke"
        },
        {
          "name": "Han Solo"
        },
        {
          "name": "Leia"
        }
      ]
    }
  }
}

Is there a similar mechanism/library/pattern that can be used in gRPC to achieve the same?

评论

FieldMask is similar in protobuf. It is a list of fields to retain, so the first example would be paths: "hero.name" and the second would be paths: ["hero.name", "hero.friends.name"].

It is probably most frequently used to specify which fields should be changed in an update. But it can equally be used to specify the fields that should be returned.

The server can either process the FieldMask directly (e.g., only using the listed fields in a SELECT SQL query), or it can retrieve all the information and filter the result using FieldMaskUtil.merge() to copy just the requested fields into a new proto message to return to the client.

IIUC, GraphQL is merely transferring the (string) query across the network where it's being processed by a backend, generating the result, that is then shipped back to the client.

I think the idiomatic gRPC approach would be to have distinct methods:

service HeroService {
  rpc Hero(HeroRequest) returns (HeroResponse);
  rpc Friends(FriendsRequest) returns (FriendsResponse);
}

If you wanted to use gRPC to transfer a GraphQL-like, you could encapsulate the query in your request, process the GraphQL on the backend as before and then ship the results in a protobuf message back to your client:

service HeroService {
  rpc Query(QueryRequest) returns (QueryResponse);
}
method QueryRequest {
  string query = 1;
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 微服务相关
    文章目录 一、微服务 1.什么是微服务架构 2.注册中心 consul 2、Consul服务注册中心的整体架构 3、Consul如何通过Raft协议实现强一致性? 4、Consul如何通过Agent实现分布式健康检查? 3、服务之间如何通信 同步调用 异步消息调用 4、服务宕机等异常情况的处理 RPC与gRPC RPC工作模式 gRPC的特性与优缺点 HTTP和RPC的优缺点 Go语言中的RPC支持与处理 grpc protobuffer 为什么高 来源:https://blog.csdn.net/weixin_43746433/article/details/110149345
  • 如何查询整个 Realm 数据库中的特定数据,而不仅仅是特定字段或属性(how to query the whole Realm database for a specific data and not only from a specific field or attribute)
    问题
  • 当仅填写两个必填字段中的一个时如何验证表单[关闭](How to validate form when only one out of two required fields is filled in [closed])
    问题 很难说出这里问的是什么。 这个问题是模棱两可的、含糊的、不完整的、过于宽泛或修辞的,不能以其目前的形式得到合理的回答。 如需帮助澄清此问题以便重新打开它,请访问帮助中心。 8 年前关闭。 我有一个联系表格。 它会询问您的姓名,然后询问您是否希望通过电话或电子邮件与您联系。 电话和电子邮件字段是隐藏的,除非用户选择电话或电子邮件的单选按钮。 单击电话或电子邮件后,我会验证他们是否输入了正确的电话或电子邮件地址。 我的问题是如何检查 JQuery 验证并在用户未单击任一单选按钮时打印出错误消息? 回答1 您是否只是在询问如何验证一组单选按钮? 由于您没有展示任何代码,我只能向您展示如何使用插件验证一组radio input 。 然后,您将使用内置规则方法从相应的输入中动态添加/删除规则。 同样,在自定义解决方案之前,我需要查看您的代码。 工作演示:http://jsfiddle.net/PbHwX/ jQuery : $(document).ready(function () { $('#myform').validate({ rules: { radiotest: { required: true } }, messages: { radiotest: { required: "please select at least one option" } } }); })
  • 为什么在Elasticsearch中需要“ store”:“ yes”?(Why do I need “store”:“yes” in elasticsearch?)
    问题 我真的不明白为什么在核心类型链接中它会在属性描述中说(例如,对于一个数字): store-设置为yes,将实际字段存储在索引中,否,则不存储它。 默认为no(请注意, JSON文档本身已存储,可以从中检索) index-如果不应该为该值建立索引,则设置为no。 在这种情况下,应该将store设置为yes,因为如果未对它进行索引和存储,则与它无关 这两个大胆的部分似乎矛盾。 如果"index":"no", "store":"no"我仍然可以从源中获取值。 例如,如果我有一个包含URL的字段,这可能是一个很好的用途。 不? 我做了一个小实验,我有两个映射,在一个字段中将字段设置为"store":"yes" ,在另一个字段中将其设置为"store":"no" 。 在两种情况下,我仍然可以在查询中指定: {"query":{"match_all":{}}, "fields":["my_test_field"]} 我得到了相同的答案,返回了现场。 我认为,如果将"store"设置为"no"则意味着我无法检索特定字段,而必须获取整个_source并在客户端进行解析。 那么,将"store"设置为"yes"有什么好处? 仅当我从"_source"字段中明确排除该字段时,它才有意义吗? 回答1 我认为,如果将“ store”设置为“ no”,则意味着我无法检索特定字段,而必须获取整个
  • 签署 PDF 时在同一页面上的多个位置放置签名(Placing signature in multiple location on same page while signing a PDF)
    问题 我想在 PDF 的多个位置放置相同的外部签名签名容器(签名值)。 我已经提到了“如何使用 itextsharp.net 将相同的数字签名放置到 PDF 中的多个位置”页面。 在使用上述解决方法时,我观察到,每当我尝试在单个页面上放置多个签名 4-5 次时,它都没有成功。 始终只显示一个有效的签名字段,其他字段显示为未签名(未签名的 PDF 表单字段)。 所以无法理解问题所在。 现在我想知道是否有任何参考资料可用于查看 PdfLiteral 和 PdfIndirectReference 是如何工作的? 我已经浏览了 itextsharp 参考文档,但无法获得足够的信息。 除此之外,对可以在 PDF 中添加多少个注释/签名字段有任何限制吗? 如果我必须使用 BlankSignatureContainer 和 MakeSignature.SignDeferred 那么签名将如何附加到所有字段,因为在, MakeSignature.SignDeferred(pdfreader, "Sig", output, externalcontainer) 我们只需要传递一个签名字段名称。 谢谢你。 回答1 你要的东西是 mkl 写的: 注意:虽然此过程创建的内容不违反 PDF 规范的字母(仅禁止从多个页面引用相同字段对象的情况,无论是通过相同的小部件还是通过不同的小部件)
  • SQL - Get value for a specific element in array
    I asked this question few days ago, but it involves a bit deeper answer so it was suggested I create a brand new one, so here it goes... Disclaimer: I cannot create any custom DB objects (functions, SP's, views etc.), so everything needs to be in-line inside a SQL query. I'm querying Audit table which for the simplicity of this question has following fields: AttributeMask ChangedData CreatedOn ObjectId Each record in a DB may have multiple Audit records associated with it. Every time a change is made to a DB record, it will create a record in the Audit table with specific ObjectID that will
  • JSON单值解析(JSON single value parsing)
    问题 在python中,您可以获取json对象并从中获取特定项目,而无需声明结构,将其保存到结构中,然后像Go中那样获取值。 有没有一种包装或更简单的方法可以在Go中存储来自json的特定值? Python res = res.json() return res['results'][0] 去 type Quotes struct { AskPrice string `json:"ask_price"` } quote := new(Quotes) errJson := json.Unmarshal(content, &quote) if errJson != nil { return "nil", fmt.Errorf("cannot read json body: %v", errJson) } 回答1 您可以解码为map[string]interface{} ,然后按键获取元素。 data := make(map[string]interface{}) err := json.Unmarshal(content, &data) if err != nil { return nil, err } price, ok := data["ask_price"].(string); !ok { // ask_price is not a string return nil
  • 每个优秀的数据库/ SQL开发人员都应该能够回答的问题(Questions every good Database/SQL developer should be able to answer [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 我正在研究每一个好的.Net开发人员应该能够回答的问题,并且对该问题的内容和方法留下了深刻的印象,因此,本着同样的精神,我向数据库/ SQL Developer发问这个问题。 您认为一个好的数据库/ SQL程序员应该回答什么问题? 回答1 不同类型的JOIN: 内部联接左右外侧联接完全加入交叉加入 参见Jeff Atwood的JOIN视觉解释 什么是钥匙? 候选密钥? 主键? 备用键? 外键? 什么是索引,它对您的数据库有何帮助? 有哪些可用的数据类型以及何时使用哪些数据类型? 回答2 在此重印我的答案,作为主题的一般准则。 基本 从表中SELECT列汇总第1部分: COUNT , SUM , MAX / MIN 汇总第2部分: DISTINCT , GROUP BY , HAVING 中间的 JOIN s,ANSI-89和ANSI-92语法 UNION vs UNION ALL NULL处理: COALESCE和本机NULL处理子查询: IN
  • Attribute(特性),怎么用才更好?
    Attribute(特性),怎么用才更好? 2010-08-06 09:49 金色海洋(jyk) 阅读(5508) 评论(107) 编辑 收藏 实体类、字段信息、表单信息、验证信息,他们要如何映射?Attribute要如何应用才更理想? 前几年:  2008年的某一天,我坐火车去北京。硬卧上铺,一晚上就到北京了。爬到上铺之后发现,旁边上铺有一老兄抱着一个笔记本,一开始还以为是看电影呢,仔细一看才发现——老天呀,居然在写代码!   这老兄也太工作狂了,当时可是晚上九点多了呀。屏幕里的IDE和vs有一点像,但又不是。问过了之后才知道,原来是大名鼎鼎的java(具体叫啥记不清楚了,好像是j2ee,对java相当的不熟,就是那个意思了)。遇到java高手了,不能错失良机,要问问心中的疑问。   于是我就问他“听说java都在用Hibernate,需要把一些信息记录在XML里?”。  老兄说“是呀,以前都这么用。”  “以前?怎么是以前?”  “因为用XML记录信息不方便。”    “那么现在呢?”  “现在用特性了,把需要的信息放在特性里面。”  ……   后面又闲聊了一些。   2008年的事情,对话是记不准确了,大体的意思就是这样,一开始用XML,后来用特性。当时我就觉得,俺们.net程序员怎么总是拾人家的牙恵? 现在:  这几天看到了一些关于特性和实体类的文章
  • Update a specific R package and its dependencies
    I have around 4000 R packages installed in my system (a server) and most of them are outdated because they were built before R-3.0.0. Now I know update.packages(checkBuilt=TRUE, ask=FALSE) would update all my packages but that's too slow. The thing is the users do not use most of the packages and now and then they ask me to update a package (say fields) they'd use. Now if I run install.packages("fields") it would only update the package fields but not the package maps even if fields depends on maps. Thus when I try to load the package fields: library("fields") I get an error message Error
  • 分享一下涉及领域比较全面的java面试题吧
    基础问题 linux和网络基础 (1)linux系统内核态和用户态是什么,有什么区别? (2)BIO、NIO、AIO都是什么,有什么区别? (3)TCP和UDP的区别? (4)详细叙述TCP3次握手,TCP和HTTP的区别,其中字节面试官问的最细,他会具体问TCP底层的3次握手的具体实现逻辑,第三次握手如果失败会怎样。 建议把TCP关闭时的4次挥手也看看,文章就有,看了至少表面的东西难不倒你们,由于这个是最基础的问题,如果回答不好,面试官的印象分就你懂得。 (5)rpc和http的区别,你知道有什么rpc框架。 (6)https相对http都实现了什么加密方式,是对称加密还是非对称加密? (7)用linux命令怎么做分组求和,怎么把字符串根据分隔符变成数组(这里建议大家读读linux命令篇) JVM基础 (1)简要介绍一下JVM虚拟机(这个问题不是把JVM分成JMM,类加载和GC来问,一定要想好怎么描述JVM) (2)简述一次GC的过程(Minor gc和Major gc过程还记得么) (3)JMM是什么? (4)JVM共享内存都有什么,什么是堆外内存? (5)GC区域,垃圾回收算法,垃圾回收器,G1、CMS、ParNew等垃圾回收器的简介和之间的区别。 (6)类加载过程(5个过程最好能研究明白,因为还涉及到栈帧、局部表量表、操作数栈、动态链接和方法出口等知识,去看一下文章就明白了
  • PATCH 方法是否应该在响应正文中返回资源的所有字段?(Should the PATCH method return all fields of the resource in the response body?)
    问题 PATCH 方法是否应该在响应正文中返回资源的所有字段? 还是应该只返回更新的字段? 我在读这个 例如,如果它只返回更新的字段,用户可以知道服务器中更新了哪些字段,而用户更新了一些字段。 **Users resource representations** name: string age: number createdon: date modifiedon: date PATCH /users/{userId} Request body { name: 'changedname', } Response body Case1 { name: 'changedname', age: 20, createdon: 2016-01-01, modifiedon: 2016-06-09 } Response body Case2 { name: 'changedname', modifiedon: 2016-06-09 } 回答1 通常这应该通过内容协商来处理。 换句话说,如果客户需要一个特定的表示,它会要求一个特定的表示。 请求将如下所示: PATCH /user/123 Content-Type: application/merge-patch+json Accept: application/vnd.company.user+json ... 在这种情况下
  • 2021年字节、蚂蚁金服 的测试开发面试经验
    字节的测试开发岗位面试经验分析 字节面试蚂蚁面试面试总结 2020年底到新加坡,歇了4个月开始找工作,分别投了字节跳动、蚂蚁金服2家。2家都是4轮面试,前3轮是技术面、最后一轮HR面试。幸运的通过了这2家的面试,分享一下面试经验。希望能帮助到有需要的人。 字节面试 测试开发面试4轮,前3轮都属于技术面试,每次70分钟左右,最后一轮HR面试(HR面试你只要不犯混就行)。直接贴上3轮面试问题: 1面: 1.项目介绍,根据项目问问题,比如安全举个例子说明你怎么测试? 2.对于隐私保护,你认为哪些是客户的隐私? 3.如果同意隐私条款,但是软件在偷偷越权使用我的文件和视频,你认为有什么原因? 4.AI领域,什么是TensorFlow? 5.除了TF还有其他的同等的表达吗? 6.那TensorFlow和Caffe有什么区别? 7.AI产品流程是什么?具体解决什么问题?应用场景是什么? 8.AI软件通过什么标准判断结果是否好? 9.功能的接口测试,你是怎么测试的? 10.性能测试,如果客户端出现假死,怎么定位? 11.AI的性能测试,你测试过的有哪些什么原因导致性能不好? 12.编译选项为什么影响性能? 13.上拉刷新页面(比如淘宝的刷新),请你设计测试用例 14.给出一个洗牌的编程方式 15.给出洗牌的测试思路和设计 16.你对你自己的职业定位和发展方向是什么? 2面: 1
  • 8000字干货:那些很厉害的人是怎么构建知识体系的
    本文约8000字,正常阅读需要15~20分钟。读完本文可以获得如下收益: 分辨知识和知识体系的差别理解如何用八大问发现知识的连接点;掌握致用类知识体系的构建方法;能够应用甜蜜区模型找到特定领域来构建知识体系。 1. 知识体系?有必要吗? 小张准备通过跑步锻炼身体,可因为之前听说过小腿变粗、膝盖受伤、猝死等等与跑步有关的意外状况,有点担心自己会掉进各种坑里,就在微信上问朋友圈一直晒跑步里程的朋友老安。 小张问老安:“老安,我想跑步,有什么要注意的没?” 老安回答:“注意跑姿就行了,要前脚掌先着地,不然容易损伤膝盖。”说完还给小张发了张片。 小张大喜,心想,幸亏问了老安,不然膝盖就废了。 第二天早上上班,小张碰见一个部门的黑子,想起来黑子前段时间说他参加了什么夜跑团,就问黑子:“黑子,听说你参加了夜跑团,跑步经验肯定很丰富了,我最近也想跑步,担心跑出问题,给点建议怎么样?” 黑子说:“建议嘛,的确有一条啊,别轻信网络上各种文章说的什么脚后跟先着地容易损伤膝盖应该前脚掌先着地之类的话。你知道吗,我参加的夜跑团里,有很多经验丰富的跑者,他们说呀,80%的马拉松跑者跑步时都是后脚跟先着地。人家跑那么久那么远都没事儿,就说明,脚后跟先着地是正确的选择。”黑子说着,拿出手机,找了张图给小张看。 小张边看图边说:“有道理,有道理,还是黑子专业。”可他心里面却犯嘀咕,怎么回事儿啊这是,老安和黑子
  • Server implementation of RFC 2388 multipart POST conflict with RFC 2047?
    I'm trying to implement RFC 2388 on a HTTP server to support multipart POST. I am looking at the specification specifically at the content-disposition's "name" parameter. Under section 3 of RFC 2388 it states: Field names originally in non-ASCII character sets may be encoded within the value of the "name" parameter using the standard method described in RFC 2047. I have 'heard' that no UA currently support RFC2047 on form control names. They will simply send the text in it's original encoding. (i.e. if the form control's name is in Japanese using UTF-8 it'll send the multipart POST request
  • 从 RData 文件中提取特定数据(Extracting specific data from an RData file)
    问题 我请求原谅我过去一个月一直在学习的 R 的无知。 具体来说,我已经下载了许多感兴趣的国家/地区的 xxx_adm-_RData 文件(xxx 代表国家/地区 - 为 0、1 或 2)。 我真正感兴趣的只是每个国家/地区的长/纬度坐标,我可以用它来叠加对降雨量、温度等气候领域的分析。在过去的两周里,我一直在浏览 SO 帖子,了解如何访问一个RData 文件中的国家坐标并将它们与其他数据一起使用,但没有任何成功。 我在下载后尝试获取谷歌地图或 readGR() 或 readBin() 没有成功。 我想知道我所要求的是否可行。 回答1 将 rdata 文件放入工作目录后,执行类似的操作 load("C:/Users/1_adm.RData", ex <- new.env()) ls.str(ex) rdata 将变量加载到您的工作区中,以便该命令将向您显示变量名称,以便您可以使用它们。 我没有你说的文件,所以我不能告诉你如何访问你需要的特定字段。 编辑 根据您的评论:好的,所以您加载的对象是 SpatialPolygonsDataFrame 类型的对象,并且它有一个名为 Polygons 的 Slot/property,具有 Polygon 类型的对象。 我假设的那些多边形是全国各地的经纬度坐标。 访问坐标应该看起来像 ps <- gadm@polygons[1] 然后像 ps
  • 求助求助——请教各位高手,抽出一点宝贵的时间根据这个实例讲解一下应该如何分层呢?
    求助求助——请教各位高手,抽出一点宝贵的时间根据这个实例讲解一下应该如何分层呢? 2006-08-18 06:23 金色海洋(jyk) 阅读(1330) 评论(6) 编辑 收藏 请各位高手帮帮忙,能不能抽出点宝贵时间,根据这个实例来讲解一下您是如何分层的呢?还望各位高手不吝赐教!谢谢大家! 有很多的问题没有明确,比如三层架构的定义到底是什么呢?(有些人说我的是分层,有的说不是。我个人感觉还是分层了)各个层的定义又是如何呢?每个层里都需要实现什么功能,放哪些代码呢?这些好像都并不是很明确。常常可以看到两个人(或多个人)讨论的很激烈,但是到最后才发现其实讨论的的东东并不完全一致。虽然都是用了数据访问层(或是逻辑层)的名词,但是各自的理解却是不一样的。大家在理论上的讨论比较多,但是具体到一个实例上的却比较少,有的话也是个说各的,不够统一,影响理解。这里本人斗胆,定了一个命题,邀请各路高手针对这个实例来讨论一下,如何划分层次,哪些代码应该放在哪些层里面等问题。谢谢大家的帮忙。题目很简单 —— 实现一个添加数据的功能。说明:简单,才可以更明晰、快速一些,让更多的人更容易地看懂。简单的都没有分清楚的话,复杂的就更晕了呀。:) 环境介绍IDE:vs2003语言方面:asp.net 1.0、ADO.NET 1.0、数据库:Server SQL 2000实现的功能:项目里的一个简单但是很常用的功能
  • 一个表的SQL更新字段来自另一个表的字段(SQL update fields of one table from fields of another one)
    问题 我有两个表: A [ID, column1, column2, column3] B [ID, column1, column2, column3, column4] A将始终是B子集(意味着A所有列也在B )。 我想用A中所有列的A的数据更新B具有特定ID的记录。 此ID在A和B都存在。 是否有UPDATE语法或任何其他方法可以执行此操作而无需指定列名,而只需说“设置A的所有列” ? 我使用的是PostgreSQL,因此也可以接受特定的非标准命令(但是,不是首选)。 回答1 您可以使用非标准的FROM子句。 UPDATE b SET column1 = a.column1, column2 = a.column2, column3 = a.column3 FROM a WHERE a.id = b.id AND b.id = 1 回答2 这个问题很老,但是我觉得还没有给出最好的答案。 是否有UPDATE语法...而未指定列名? 动态SQL的一般解决方案 除了要连接的某些唯一列(示例中的id )外,您不需要知道任何列名。 我可以想到的任何可能的情况都可以可靠地工作。 这是特定于PostgreSQL的。 我正在基于information_schema(尤其是表information_schema.columns)构建动态代码,该表在SQL标准中定义,并且大多数主要的RDBMS
  • 无需用户执行即可重置 MySQL 字段值(Resetting a MySQL Field value without user execution)
    问题 我需要在午夜自动重置 MySQL 字段值。 它是表中特定行中的特定列。 我知道如何在 PHP 中执行此操作,但我不知道如何在午夜执行 PHP 脚本而无需有人自己执行。 你有任何可行的解决方案吗? 编辑:-------------------- 最好不使用 Cron 作业。 回答1 如果您在 linux 上运行,您将使用 cronjob 在大多数发行版中,有一个名为 crontab 的命令可以为您安排任务和您需要的特定格式: 0 0 * * * php /path/to/file.php 编辑:在编辑之前写的:p 我不确定还有其他方法。 你有什么不使用 cronjob 的特定理由吗? 如果 php 文件被标记为可执行文件,你甚至可能不需要指定 php 部分,即 0 0 * * * /path/to/file.php 只需在 linux 命令行中执行“chmod +x /path/to/file.php” 回答2 也有基于网络的 cron 服务。 基本上,您建立一个帐户,然后他们会定期访问您选择的 URL。 在您的服务器上,您设置了一个页面来完成您需要完成的工作。 最好给它一个不太可能找到的名字,比如 myjob789273634ahhh8s2nhw8sghusgf874wfu.php。 你明白了。 (请记住 PHP 脚本在 30 秒后超时。) 这是一个谷歌搜索:**哎‘
  • 拆分开始和结束时的空字符串 [重复](Empty strings at the beginning and end of split [duplicate])
    问题 这个问题在这里已经有了答案: 9年前关闭。 可能的重复: Ruby 中的拆分问题 在 Ruby 中,当我使用与字符串开头匹配的分隔符拆分字符串时,它会在数组的初始位置给出一个空字符串: "abc".split(/a/) # => ["", "bc"] 但是当我使用与字符串末尾匹配的分隔符执行类似操作时,它不会给出空字符串: "abc".split(/c/) # => ["ab"] 这对我来说看起来不一致。 这样的规范有什么理由吗? 编辑如果它要与 Perl 的规范兼容,就像在 muu 中要简短的回答一样,那么问题仍然是一样的:为什么在 Perl 中是这样? 因为这个原因,现在它也变成了一个关于 Perl 的问题。 回答1 从精美的手册: split(pattern=$;, [limit]) → anArray [...] 如果省略limit参数,则会抑制尾随空字段。 如果limit为正数,则最多返回该数量的字段(如果limit为 1,则整个字符串将作为数组中的唯一条目返回)。 如果为负,则返回的字段数没有限制,并且不抑制尾随空字段。 所以尾随的“空字段”被抑制,因为文档说它们是。 如果您想要尾随的空字符串,请询问它: 'abc'.split(/c/, -1) # [ 'ab', '' ] 为什么会这样呢? 可能是因为它匹配 Perl 的拆分行为: 如果LIMIT为负