当前位置: 首页 > 知识库问答 >
问题:

能否特制一个确定函数返回类型的正则表达式?

宋翔
2023-03-14

给定以下函数的文本:

function f3() {
  return Math.random() > 0.5 ? Promise.resolve(true): 'naaah'
}

可以编译一个正则表达式来确定< code>f3()调用的返回类型,而不实际调用函数吗?

共有3个答案

云和同
2023-03-14

答案是否定的。因为返回类型是根据Math.random()的结果确定的,而Math.random()的结果直到运行时才知道。必须执行这个特定的函数才能知道返回类型。

濮俊美
2023-03-14

不,仅使用RegEx无法以编程方式确定该函数的返回类型。为了理解该函数的功能,您需要解析其代码。然而,JavaScript是乔姆斯基2型语法(上下文无关语法),RegEx是乔姆斯基3型语法(常规语法)。JavaScript从根本上来说太复杂了,无法用RegEx进行解析。

如果你只是想处理这样一个事实,即你把函数作为文本并且你需要评估它,你可以使用 eval() 函数。

梅飞龙
2023-03-14

给定代码,我们无法通过正则表达式确定其返回类型。矛盾证明:

>

  • 假设我们可以使用正则表达式找到返回类型。

    返回类型在最后一行中通过对随机的非确定性调用来决定(提前不知道)。

    正则表达式是确定性的-当在同一输入上运行时,它们总是具有相同的输出。

    因此,函数的返回类型必须是静态的,因为我们可以运行正则表达式并找到返回类型(并且该正则表达式将始终返回相同的内容)。

    矛盾:函数的返回类型必须是静态的,但由于随机,函数的返回形式是可变的

    注意:上述假设类型必须是单个类型,并且本身不考虑联合类型。

    此外,证明了为什么我们不能一直这样做。

    > < li>

    假设我们可以以某种方式找出函数中使用的每种类型。

    在某些时候,我们生成一个字符串 a=“A” Math.random()

    稍后,我们生成一个字符串b=“class”a“{…}

    在这个定义之后,我们执行< code > c = eval(" new " a "()" 。

    当我们返回 c 时,没有正则表达式可以知道类型 - 类型在函数中新命名,随机确定,并且每次执行都不同。

    这假设问题是一个更一般的“javascript正则表达式是否可以找到泛型函数的返回类型”。请注意,如果可以找到返回类型,则可以告诉程序停止(如果不停止,则无法返回,如果从不停止,则返回类型必须未定义),并且停止问题仍然没有解决。

  •  类似资料:
    • 问题内容: 也许这是一个愚蠢的问题,但是有没有办法找到所有返回特定类型的函数(在标准库或GOPATH中)? 例如,有许多函数使用io.Writer作为参数。现在,我想知道如何创建io.Writer,并且有很多方法可以做到这一点。但是,如何能轻松地找到所有方法而又无需猜测软件包并仔细查看所有方法以找到返回io.Writer(或我追随的其他任何类型)的方法? 编辑: 我应该扩展我的问题,以查找实现特定

    • 我目前拥有的正则表达式是: 它捕获了其中一个“.”(第1组)第2-4组为空 或: 一组小写、点、破折号。以小写字母开头(第2组) ——后跟可选星号(第3组) ——后跟方括号内的可选内容(第4组) 我有两个问题,第一个是让第二组必须以字母结尾,我尝试了很多方法,包括: 能杀死3-4组的任何生物 这似乎没什么不同 我遇到的另一个问题是组4,它不依赖于方括号(这是有意义的,因为我有*字符为他们)...但

    • 我有这些句子: 我想知道单词或或或或是否在句子中。 我试过这个:

    • 问题内容: 我在RosettaCode上找到了以下Java代码示例: 我不是特别了解Java,但除了正则表达式本身以外,都了解此代码段的所有方面 当您在内置PHP函数中找到它时,我对Regex有了基本的了解。 素数如何匹配? 问题答案: 您说您了解这部分,但仅强调一下,生成的字符串的长度等于提供的数字。因此,当且仅当字符串包含三个字符。 正则表达式的第一部分说:“任何字符,零次或一次”。因此,基本

    • 问题内容: 我有一个只能返回的函数,或者它们都是类型。我想将这一事实包括在签名中,因为它们在功能上下文中具有特殊含义。我怎么做? 目前,我用这个 那是正确的吗? 我知道我可以做到 但是正如我所说,我想在签名中表示该函数仅返回那些特定值。 问题答案: mypy能够将检出为无效语句: Python 3.8 多亏了PEP 586 ,将是已经包含默认的Python 3.8模块。

    • 问题内容: 我想获得正则表达式的第一场比赛。 在这种情况下,我得到了一个列表: [‘33’,‘44’] 我可以提取列表的第一个元素: ‘33’ 但这仅在至少有一个匹配项的情况下有效,否则我将收到错误消息: IndexError:列表索引超出范围 在这种情况下,我可以定义一个函数: 是否有一种无需定义新功能即可获得该结果的方法? 问题答案: 您可以通过添加默认值到您的正则表达式中: 也可以与其他人指