CN116594716A - 基于函数重载决议的函数处理方法、介质及装置 - Google Patents
基于函数重载决议的函数处理方法、介质及装置 Download PDFInfo
- Publication number
- CN116594716A CN116594716A CN202310571314.6A CN202310571314A CN116594716A CN 116594716 A CN116594716 A CN 116594716A CN 202310571314 A CN202310571314 A CN 202310571314A CN 116594716 A CN116594716 A CN 116594716A
- Authority
- CN
- China
- Prior art keywords
- function
- type
- candidate
- functions
- determining
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000003672 processing method Methods 0.000 title claims abstract description 16
- 230000006870 function Effects 0.000 claims abstract description 1221
- 238000000034 method Methods 0.000 claims abstract description 65
- 238000012545 processing Methods 0.000 claims description 17
- 238000012360 testing method Methods 0.000 description 16
- 230000008569 process Effects 0.000 description 12
- 238000004422 calculation algorithm Methods 0.000 description 7
- 238000010586 diagram Methods 0.000 description 7
- 230000000694 effects Effects 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000013475 authorization Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 231100000957 no side effect Toxicity 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000012216 screening Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/4492—Inheritance
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本公开的实施方式提供了一种基于函数重载决议的函数处理方法、介质及装置,涉及计算机技术领域。该方法包括:响应于函数调用指令,确定函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,函数调用指令用于指示调用函数;根据待调用函数名称、实参类型以及上下文类型,确定函数候选集合;其中,函数候选集合中包括至少一个候选函数,候选函数的名称和待调用函数的名称相同,候选函数的形参类型为实参类型的父类型,候选函数的返回类型为上下文类型的子类型;若函数候选集合包括多个候选函数,则根据候选函数的返回类型,确定决议结果。通过上述方法,本公开的方法使得确定出的目标函数更加准确,符合调用需求。
Description
技术领域
本公开的实施方式涉及计算机领域,更具体地,本公开的实施方式涉及一种基于函数重载决议的函数处理方法、介质及装置。
背景技术
本部分旨在为权利要求书中陈述的本公开的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
在计算机编程领域中,可以采用同一个函数名来命名多个函数,且多个函数的函数类型(例如,函数类型中的形参类型和/或返回类型等)互不相同,进而可以将上述函数称作重载函数。
然而,当同一函数名对应多个函数时,在实际调用过程中,如何在多个函数中选择出符合当前调用需要的函数是一个亟需解决的问题。
发明内容
本公开提供一种基于函数重载决议的函数处理方法、介质及装置,以解决相关技术中的函数重载决议方法所确定的函数无法满足实际调用需求的问题。
在本公开实施方式的第一方面中,提供了一种基于函数重载决议的函数处理方法,包括:
响应于函数调用指令,确定所述函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,所述函数调用指令用于指示调用函数;所述实参类型表征所述函数调用指令中所包括的待传入所述待调用函数的实际参数的类型;所述上下文类型表征所述函数调用指令所指示的调用结果类型;
根据所述待调用函数名称、所述实参类型以及所述上下文类型,确定函数候选集合;其中,所述函数候选集合中包括至少一个候选函数,所述候选函数的名称和所述待调用函数的名称相同,所述候选函数的形参类型为所述实参类型的父类型,所述候选函数的返回类型为所述上下文类型的子类型;所述返回类型表征所述候选函数的返回值的类型;
若所述函数候选集合包括多个候选函数,则根据所述候选函数的返回类型,确定决议结果;其中,所述决议结果用于指示在所述函数候选集合中是否可以确定出唯一的目标函数。
在本公开的一个实施例中,根据所述候选函数的返回类型,确定决议结果,包括:
若所述函数候选集合包括第一函数,且所述第一函数的数量为一个,则确定所述第一函数为目标函数,其中,所述第一函数的返回类型为所述函数候选集合中的其余全部候选函数的返回类型的子类型。
在本公开的一个实施例中,根据所述候选函数的返回类型,确定决议结果,包括:
若所述函数候选集合中不存在所述第一函数,或者,所述函数候选集合中的第一函数数量为多个,则确定所述函数候选集合中不存在目标函数。
在本公开的一个实施例中,根据所述候选函数的返回类型,确定决议结果,包括:
根据所述形参类型和所述返回类型,确定决议结果。
在本公开的一个实施例中,根据所述形参类型和所述返回类型,确定决议结果,包括:
若确定所述函数候选集合包括第二函数,且所述第二函数的数量为一个,则确定所述第二函数为目标函数;所述第二函数的形参类型为所述函数候选集合中的其余全部候选函数的形参类型的子类型,且所述第二函数的返回类型为所述函数候选集合中的其余全部候选函数的返回类型的子类型。
在本公开的一个实施例中,根据所述形参类型和所述返回类型,确定决议结果,包括:
若确定所述函数候选集合中不存在第二函数,或者,所述函数候选集合中包括的第二函数的数量为多个,则确定不存在目标函数。
在本公开的一个实施例中,确定所述函数候选集合中不存在第二函数,包括:
确定候选函数所对应的元组,所述元组包括所述候选函数的形参类型和所述候选函数的返回类型;
重复以下步骤,直至i的取值大于预设值:针对于第i个元组和第j个元组,若确定所述第i个元组中存在一个形参类型并非所述第j个元组中的形参类型的子类型,或者所述第i个元组中的返回类型并非所述第j个元组中的返回类型的子类型,则确定所述第i个元组不是第二函数;令i的取值加1;其中,i为正整数,j为正整数,且i和j的取值不同;所述预设值为所述函数候选集合中候选函数的总数量;
若确定所有候选函数都并非第二函数,则确定所述函数候选集合中不存在第二函数。
在本公开的一个实施例中,根据所述形参类型和所述返回类型,确定决议结果,包括:
若确定所述函数候选集合中存在多个第一函数,则获取所述第一函数的形参类型;所述第一函数的返回类型为所述函数候选集合中的其余全部候选函数的返回类型的子类型;
若在所述多个第一函数中包括第三函数,且所述第三函数的数量为一个,则确定所述第三函数为目标函数;所述第三函数的形参类型为所述多个第一函数中其余全部第一函数的形参类型的子类型。
在本公开的一个实施例中,根据所述形参类型和所述返回类型,确定决议结果,包括:
若所述多个第一函数中不存在第三函数,或者,所述多个第一函数中包括多个所述第三函数,或者,所述函数候选集合中不存在第一函数,则确定不存在目标函数。
在本公开的一个实施例中,根据所述形参类型和所述返回类型,确定决议结果,包括:
若确定所述函数候选集合中包括第一函数,且所述第一函数的数量为一个,则确定所述第一函数为所述目标函数。
在本公开的一个实施例中,根据所述形参类型和所述返回类型,确定决议结果,包括:
若确定所述函数候选集合中存在多个第四函数,则获取所述第四函数的返回类型;所述第四函数的形参类型为所述函数候选集合中的其余全部候选函数的形参类型的子类型;
若在所述多个第四函数中包括第五函数,且所述第五函数的数量为一个,则确定所述第五函数为目标函数;所述第五函数的返回类型为所述多个第四函数中其余全部第四函数的返回类型的子类型。
在本公开的一个实施例中,根据所述形参类型和所述返回类型,确定决议结果,包括:
若在所述多个第四函数中不存在所述第五函数,或者,所述第五函数的数量为多个,或者,所述函数候选集合中不存在所述第四函数,则确定不存在目标函数。
在本公开的一个实施例中,根据所述形参类型和所述返回类型,确定决议结果,包括:
若确定所述函数候选集合中包括第四函数,且所述第四函数的数量为一个,则确定所述第四函数为所述目标函数。
在本公开的一个实施例中,还包括:
若所述决议结果表征存在目标函数,则根据所述目标函数和所述函数调用指令所对应的实参,确定函数调用结果。
在本公开的一个实施例中,还包括:
若所述决议结果表征不存在目标函数,则返回第一错误信息,所述第一错误信息用于表征无法确定目标函数。
在本公开的一个实施例中,还包括:
若确定所述函数候选集合中仅包括一个候选函数,则确定所述候选函数为目标函数;
若确定所述函数候选集合为空,则返回第二错误信息,所述第二错误信息用于表征无法获取到候选函数。
在本公开实施方式的第二方面中,提供了一种基于函数重载决议的函数处理装置,包括:
第一确定模块,用于响应于函数调用指令,确定所述函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,所述函数调用指令用于指示调用函数;所述实参类型表征所述函数调用指令中所包括的待传入所述待调用函数的实际参数的类型;所述上下文类型表征所述函数调用指令所指示的调用结果类型;
第二确定模块,用于根据所述待调用函数名称、所述实参类型以及所述上下文类型,确定函数候选集合;其中,所述函数候选集合中包括至少一个候选函数,所述候选函数的名称和所述待调用函数的名称相同,所述候选函数的形参类型为所述实参类型的父类型,所述候选函数的返回类型为所述上下文类型的子类型;所述返回类型表征所述候选函数的返回值的类型;
第三确定模块,用于若所述函数候选集合包括多个候选函数,则根据所述候选函数的返回类型,确定决议结果;其中,所述决议结果用于指示在所述函数候选集合中是否可以确定出唯一的目标函数。
在本公开的一个实施例中,第三确定模块,包括:
第一确定单元,用于若所述函数候选集合包括第一函数,且所述第一函数的数量为一个,则确定所述第一函数为目标函数,其中,所述第一函数的返回类型为所述函数候选集合中的其余全部候选函数的返回类型的子类型。
在本公开的一个实施例中,第三确定模块,还包括:
第二确定单元,用于若所述函数候选集合中不存在所述第一函数,或者,所述函数候选集合中的第一函数数量为多个,则确定所述函数候选集合中不存在目标函数。
在本公开的一个实施例中,第三确定模块,具体用于:
根据所述形参类型和所述返回类型,确定决议结果。
在本公开的一个实施例中,第三确定模块,包括:
第三确定单元,用于若确定所述函数候选集合包括第二函数,且所述第二函数的数量为一个,则确定所述第二函数为目标函数;所述第二函数的形参类型为所述函数候选集合中的其余全部候选函数的形参类型的子类型,且所述第二函数的返回类型为所述函数候选集合中的其余全部候选函数的返回类型的子类型。
在本公开的一个实施例中,第三确定模块,还包括:
第四确定单元,用于若确定所述函数候选集合中不存在第二函数,或者,所述函数候选集合中包括的第二函数的数量为多个,则确定不存在目标函数。
在本公开的一个实施例中,第四确定单元,具体用于:
确定候选函数所对应的元组,所述元组包括所述候选函数的形参类型和所述候选函数的返回类型;
重复以下步骤,直至i的取值大于预设值:针对于第i个元组和第j个元组,若确定所述第i个元组中存在一个形参类型并非所述第j个元组中的形参类型的子类型,或者所述第i个元组中的返回类型并非所述第j个元组中的返回类型的子类型,则确定所述第i个元组不是第二函数;令i的取值加1;其中,i为正整数,j为正整数,且i和j的取值不同;所述预设值为所述函数候选集合中候选函数的总数量;
若确定所有候选函数都并非第二函数,则确定所述函数候选集合中不存在第二函数。
在本公开的一个实施例中,第三确定模块,包括:
第一获取单元,用于若确定所述函数候选集合中存在多个第一函数,则获取所述第一函数的形参类型;所述第一函数的返回类型为所述函数候选集合中的其余全部候选函数的返回类型的子类型;
第五确定单元,用于若在所述多个第一函数中包括第三函数,且所述第三函数的数量为一个,则确定所述第三函数为目标函数;所述第三函数的形参类型为所述多个第一函数中其余全部第一函数的形参类型的子类型。
在本公开的一个实施例中,第三确定模块,还包括:
第六确定单元,用于若所述多个第一函数中不存在第三函数,或者,所述多个第一函数中包括多个所述第三函数,或者,所述函数候选集合中不存在第一函数,则确定不存在目标函数。
在本公开的一个实施例中,第三确定模块,包括:
若确定所述函数候选集合中包括第一函数,且所述第一函数的数量为一个,则确定所述第一函数为所述目标函数。
在本公开的一个实施例中,第三确定模块,还包括:
第二获取单元,用于若确定所述函数候选集合中存在多个第四函数,则获取所述第四函数的返回类型;所述第四函数的形参类型为所述函数候选集合中的其余全部候选函数的形参类型的子类型;
第八确定单元,用于若在所述多个第四函数中包括第五函数,且所述第五函数的数量为一个,则确定所述第五函数为目标函数;所述第五函数的返回类型为所述多个第四函数中其余全部第四函数的返回类型的子类型。
在本公开的一个实施例中,第三确定模块,还包括:
第九确定单元,用于若在所述多个第四函数中不存在所述第五函数,或者,所述第五函数的数量为多个,或者,所述函数候选集合中不存在所述第四函数,则确定不存在目标函数。
在本公开的一个实施例中,第三确定模块,还包括:
第十确定单元,用于若确定所述函数候选集合中包括第四函数,且所述第四函数的数量为一个,则确定所述第四函数为所述目标函数。
在本公开的一个实施例中,还包括:
第四确定模块,用于若所述决议结果表征存在目标函数,则根据所述目标函数和所述函数调用指令所对应的实参,确定函数调用结果。
在本公开的一个实施例中,还包括:
返回模块,用于若所述决议结果表征不存在目标函数,则返回第一错误信息,所述第一错误信息用于表征无法确定目标函数。
在本公开的一个实施例中,还包括:
第五确定模块,用于若确定所述函数候选集合中仅包括一个候选函数,则确定所述候选函数为目标函数;
第六确定模块,用于若确定所述函数候选集合为空,则返回第二错误信息,所述第二错误信息用于表征无法获取到候选函数。
在本公开实施方式的第三方面中,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如第一方面中任一项所述的方法。
在本公开实施方式的第四方面中,提供了一种计算设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述计算设备执行如第一方面中任一项所述的方法。
根据本公开实施方式的基于函数重载决议的函数处理方法、介质及装置,在多个候选函数中确定最终的目标函数时,会基于候选函数的返回类型进行确定。由于一个函数所对应的返回类型越小,即返回类型为更多类型的子类型时,且子类可以继承父类所有的属性,因此选择返回类型越小的函数所能访问到的成员属性和方法也就越多,进而使得所确定出的目标函数越准确,使得最终得到的处理结果也更加准确。且上述引入返回类型在候选函数中确定目标函数的方法,更适用于相关技术中重视函数计算结果的函数式编程方法。
附图说明
通过参考附图阅读下文的详细描述,本公开示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本公开的若干实施方式,其中:
图1示意性地示出了根据本公开实施方式的应用场景示意图;
图2示意性地示出了根据本公开另一实施例的基于函数重载决议的函数处理方法的流程示意图;
图3示意性地示出了根据本公开又一实施例的基于函数重载决议的函数处理方法的流程示意图;
图4示意性地示出了根据本公开再一实施例的基于函数重载决议的函数处理方法的流程示意图;
图5示意性地示出了根据本公开实施例提供的程序产品的示意图;
图6示意性地示出了根据本公开一实施例提供的基于函数重载决议的函数处理装置的结构示意图;
图7示意性地示出了根据本公开实施例提供的计算设备的结构示意图。
在附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
下面将参考若干示例性实施方式来描述本公开的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本公开,而并非以任何方式限制本公开的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
本领域技术人员知道,本公开的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
根据本公开的实施方式,提出了一种基于函数重载决议的函数处理方法、介质及装置。
在本文中,需要理解的是,所涉及的术语:
实参:实际传输给函数的参数,又称为实际参数。
形参:定义函数名和函数体时所使用的参数,用于接收调用该函数时传入的参数,又称为形式参数。
返回类型:函数执行结束之后返回值的类型。
上下文类型:函数调用所处的上下文所要求的类型。
重载决议:多个同名的函数被按照函数名称调用时,在多个同名的函数中确定被调用的函数的方法。
面向副作用编程:函数执行过程中不断修改变量的值来改变程序的状态的一种编程方式,即存在函数的副作用的编程方式。
函数式编程:一种主张无副作用的编程方式,强调函数的计算比指令的执行更为重要,即更加强调程序执行的结果。
需要说明的是,本公开所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,并且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准,并提供有相应的操作入口,供用户选择授权或者拒绝。
此外,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
下面参考本公开的若干代表性实施方式,详细阐释本公开的原理和精神。
发明概述
本发明人发现,相关技术中函数重载决议方法,容易导致确定出的函数不准确的问题。
一个示例中,方式一为相关技术中提供的重载决议方式。在进行函数重载决议时,首先在多个重载函数中根据实参类型,选择满足“实参类型为重载函数的形参类型的子类型”这一条件的函数为候选函数。之后,在多个候选函数中,筛选出形参类型最小的候选函数(即,形参类型为所有其余候选函数的形参类型的子类型)的函数为最终决议出的函数。然而,上述方法由于未考虑函数的返回类型以及上下文类型,因此容易出现决议出的函数不符合调用需求而导致的编译报错的问题。
举例来说,以下列代码举例说明:
其中,定义了两个同名的重载函数f。且D类型为C类型的子类型。在调用f函数时,即执行代码“int res=f(new D());”时,此时,上述两个函数f的形参类型均为实参类型D的父类型,因此,两个函数f都可以作为候选函数。相关技术中,在两个候选函数中选择最终决议的函数时,由于函数f(D x)的形参类型D为函数f(C x)的形参类型的子类型,因此,选择f(D x)作为最终决议的函数。然而,根据上述代码中的函数定义,函数f(D x)所对应的返回类型为boolean(布尔类型),而实际函数调用过程中所要求的上下文类型根据代码“intres=f(new D());”可知为int(整型),进而由于返回类型和上下文类型不符合,进而出现了编译报错的问题,即所决议出的最终函数选择不合理,导致无法满足实际调用需求的问题。
一个示例中,在进行重载决议时,不考虑函数的返回类型,进而导致在定义重载函数时,函数的形参类型相同,但返回类型不同的函数无法被定义,即出现编译报错的问题。即,不考虑返回类型的重载决议算法限制了编码的灵活性,使得函数的形参类型相同,但返回类型不同的函数无法采用重载函数的方式进行定义。
参照下列代码对函数定义过程进行举例说明:
上述代码中定义了两个函数f,上述两个函数的形参类型相同,均为int类型,而返回类型不同,即一个为C类型,一个为D类型。在实际编译过程中,会出现编译报错的问题,即不允许函数形参类型相同,但实参类型不同的两个函数采用重载函数的方式定义。
一个示例中,方式二为相关技术中提供的另一重载决议方式。在重载决议时,首先会根据如下两个条件:“实参类型是形参类型的子类型”以及“函数的返回类型是上下文类型的子类型”在多个同名函数中筛选出候选函数,之后,在多个候选函数中,筛选出形参类型最小的候选函数(即,形参类型为所有其余候选函数的形参类型的子类型)的函数为最终决议出的函数。如果不存在形参类型最小的候选函数或者形参类型最小的候选函数不唯一时,则重载决议失败,编译报错。然而,上述方法由于未充分考虑函数的返回类型以及上下文类型,因此容易出现决议出的函数不准确的问题。
参照下列代码对本示例中的重载决议过程进行举例说明:
class C{}
class D:C{}
func f(_x:Int)->C{return C();}
func f(_x:Int)->D{return D();}
let res:C=f(0)//编译错误
print(res)
在上述代码中,定义了两个函数f,其中,一个函数的形参类型为int,返回类型为C;另一个函数的形参类型为int,且返回类型为D。在调用重载函数时,所要求的上下文类型为C,实参类型为int类型,因此,根据上述示例中的两个条件,两个函数f均可以作为候选函数。进一步的,两个候选函数中进行筛选时,由于两个函数的形参类型相同,因此,不存在唯一的形参类型最小的候选函数,因此,会出现编译报错的问题。然而,由于返回类型D为返回类型C的子类型,因此,作为子类型的返回类型D对应又更多的成员属性和方法,相比于将返回类型为C的函数作为最终的函数,将返回类型为D的函数作为最终的函数,可以得到更加准确的结果。因此,采用上述重载决议方法,由于未充分考虑返回类型,容易导致无法确定出准确的函数。
本公开中在进行函数重载决议时,充分考虑了候选函数的返回类型,以便使得最终确定出的函数更加准确,进而使得函数调用结果更加准确。
在介绍了本公开的基本原理之后,下面具体介绍本公开的各种非限制性实施方式。
应用场景总览
首先参考图1,图1为本公开提供的一种应用场景示意图。电子设备在执行程序过程中,当执行到用于指示调用重载函数的函数调用指令,电子设备则在多个重载函数中,确定本次决议结果(例如,本次最终所选择的目标函数或者本次无法确定出目标函数),以便后续电子设备可以基于决议结果,继续进行函数处理。例如,图1中,当电子设备确定当前调用函数名为A的函数,且,函数名为A的函数具有多个时,则电子设备需要在多个函数名为A的函数中确定出本次的决议结果。
示例性方法
下面结合图1的应用场景,参考图2-4来描述根据本公开示例性实施方式的基于函数重载决议的函数处理方法。需要注意的是,上述应用场景仅是为了便于理解本公开的精神和原理而示出,本公开的实施方式在此方面不受任何限制。相反,本公开的实施方式可以应用于适用的任何场景。
图2为本公开实施例提供的一种基于函数重载决议的函数处理方法的流程示意图。如图所示,该方法包括以下步骤:
S201、响应于函数调用指令,确定函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,函数调用指令用于指示调用函数;实参类型表征函数调用指令中所包括的待传入待调用函数的实际参数的类型;上下文类型表征函数调用指令所指示的调用结果类型。
示例性地,本实施例中,当接收到用于指示调用重载函数的函数调用指令时,可以根据函数调用指令确定出当前需要调用的待调用函数的名称,当前需要传入最终确定出的待调用函数的实参对应的实参类型以及函数调用指令所要求的上下文类型。其中,上下文类型可以理解为函数调用指令所希望的最终得到的调用结果的类型。在实际应用中,函数调用指令可以理解为上述代码中的函数调用代码,函数调用代码中定义有上下文类型、实参以及待调用函数的名称。之后,可以根据相关技术中所提供的类型检查算法,确定实参类型,其中,类型检查算法可以采用相关技术中所提供的target typing算法、Algorithm W算法、Local Type Inference算法等,本实施例中不做具体限制。
S202、根据待调用函数名称、实参类型以及上下文类型,确定函数候选集合;其中,函数候选集合中包括至少一个候选函数,候选函数的名称和待调用函数的名称相同,候选函数的形参类型为实参类型的父类型,候选函数的返回类型为上下文类型的子类型;返回类型表征候选函数的返回值的类型。
示例性地,本实施例中,当确定出待调用函数的名称、实际参数类型以及上下文类型之后,会在具有待调用函数的名称的多个函数中确定出函数候选集合中所包含的候选函数。
具体地,在确定候选函数时,首选会根据待调用函数的名称确定具有该名称的多个函数,并在多个函数中确定满足如下条件的函数为候选函数:函数的形参类型为函数调用指令所指示的实参类型的父类型(即,实参类型为函数的形参类型的子类型);并且,函数的返回类型为函数调用指令所指示的上下文类型的子类型。
S203、若函数候选集合包括多个候选函数,则根据候选函数的返回类型,确定决议结果;其中,决议结果用于指示在函数候选集合中是否可以确定出唯一的目标函数。
示例性地,本实施例中,在确定出函数候选集合之后,若进一步确定函数候选集合中包括多个候选函数,则进一步的可以根据候选函数的返回类型,确定出决议结果,其中,决议结果用于表征当前是否可以确定在多个候选函数中确定出唯一的目标函数,也就是最终决议得到的最终函数。
举例来说,当需要在多个候选函数中确定目标函数时,可以根据各候选函数所对应的返回类型,确定最终的目标函数,例如,若一个候选函数的返回类型是N个候选函数的返回类型的子类型,则确定该候选函数为目标函数。其中,N为正整数,N为M除以2后取整的结果。若不存在上述函数,则确定无法确定出唯一的目标函数。
可以理解的是,本实施例中,在多个候选函数中确定最终的目标函数时,会基于候选函数的返回类型进行确定。由于一个函数所对应的返回类型越小,即返回类型为更多类型的子类型时,且子类可以继承父类所有的属性,因此选择返回类型越小的函数所能访问到的成员属性和方法也就越多,进而使得所确定出的目标函数越准确,使得最终得到的处理结果也更加准确。且上述引入返回类型在候选函数中确定目标函数的方法,更适用于相关技术中重视函数计算结果的函数式编程方法。此外,需要说明的是,本公开中所提供的基于函数重载决议的函数处理方法对于编程语言不做具体限制,即可以适用于各种编程语言下的重载决议过程。
图3为本公开实施例提供的又一种基于函数重载决议的函数处理方法的流程示意图。如图所示,该方法包括以下步骤:
S301、响应于函数调用指令,确定函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,函数调用指令用于指示调用函数;实参类型表征函数调用指令中所包括的待传入待调用函数的实际参数的类型;上下文类型表征函数调用指令所指示的调用结果类型。
S302、根据待调用函数名称、实参类型以及上下文类型,确定函数候选集合;其中,函数候选集合中包括至少一个候选函数,候选函数的名称和待调用函数的名称相同,候选函数的形参类型为实参类型的父类型,候选函数的返回类型为上下文类型的子类型;返回类型表征候选函数的返回值的类型。
示例性地,本实施例中步骤S301与步骤S302,可以参见步骤S201与步骤S202中的描述,此处不再赘述。
S303、若函数候选集合包括多个候选函数,函数候选集合包括第一函数,且第一函数的数量为一个,则确定第一函数为目标函数,第一函数的返回类型为函数候选集合中的其余全部候选函数的返回类型的子类型;其中,决议结果用于指示在函数候选集合中是否可以确定出唯一的目标函数。
示例性地,本实施例中,当确定出函数候选集合,且函数候选集合中包括多个候选函数时,此时,针对每一候选函数执行以下步骤:确定该候选函数的返回类型是否为函数候选集合中的其余全部候选函数的返回类型的子类型,若不是,则确定该候选函数不是第一函数。重复以上步骤,直至所有候选函数均被遍历结束。
通过上述步骤,若确定函数候选集合中所包含的多个候选函数中,存在第一函数,且第一函数的数量为1个,则此时可以将第一函数确定为最终的目标函数。
可以理解的是,本实施例中在通过返回类型在多个候选函数中确定目标函数时,当多个候选函数中仅存在一个第一函数的返回类型为其余全部候选函数的返回类型的子类型时,则可以确定该第一函数为返回类型最小的函数,进而函数所具有属性方法以及属性也就最多,将这样的第一函数作为目标函数,可以提高所确定的目标函数的准确性。
S304、若函数候选集合包括多个候选函数,且函数候选集合中不存在第一函数,或者,函数候选集合中的第一函数数量为多个,则确定函数候选集合中不存在目标函数。
示例性地,本实施例中,当函数候选集合中包括多个候选函数时,进一步的,若确定出多个候选函数中不存在第一函数时,则可以确定函数候选集合中不存在目标函数,即无法确定出最终的目标函数。
或者,当函数候选集合中包括多个候选函数时,进一步的,若确定出多个候选函数中存在多个第一函数时,则确定在多个第一函数中也无法确定出最终的目标函数,因此,确定函数候选集合中不存在目标。
可以理解的是,当候选集合中有多个候选函数时,但候选集合中不存在第一函数,或者存在多个第一函数时,均无法在确定出最终的唯一的目标函数,进而,通过上述方法,可以确保最终所能够得到的目标函数,一定是返回类型最小,且唯一的函数,以确保最终确定的目标函数的准确性。
S305、若决议结果表征存在目标函数,则根据目标函数和函数调用指令所对应的实参,确定函数调用结果。
示例性地,本实施例中,当最终可以确定出目标函数时,例如,在上述步骤S303之后,进一步的可以将函数调用指令中所指示的实参输入至目标函数中,进而得到并返回函数调用结果。
可以理解的是,在确定出最终的目标函数之后,进一步的还会将函数调用指令所对应的实参作为目标函数的输入参数,得到目标函数的返回结果,即最终的函数调用结果,以便完成函数调用过程。
S306、若决议结果表征不存在目标函数,则返回第一错误信息,第一错误信息用于表征无法确定目标函数。
示例性地,若确定出当前无法确定出目标函数,则此时可以返回第一错误信息,以提示用户或者函数调用方当前无法确定出目标函数,方便尽快确定出程序编译中的问题。
S307、确定函数候选集合中仅包括一个候选函数,则确定候选函数为目标函数。
示例性地,在步骤S302之后,进一步的若确定出函数候选集合中仅存在一个候选函数,即多个具有待调用函数名称的函数中仅可以筛选出一个候选函数,此时则可以直接将该候选函数作为最终的目标函数。
一个示例中,在步骤S302之后,还可以包括以下步骤:若确定函数候选集合为空,则返回第二错误信息,第二错误信息用于表征无法获取到候选函数。
示例性地,在步骤S302之后,若无法在多个具有待调用函数名称的函数中筛选出候选函数,即得到的函数候选集合为空时,此时,则可以返回第二错误信息,以便告知在目标函数的确定过程中,无法查找到实参类型和返回类型满足步骤S302中所提及的条件的候选函数,方便尽快确定出程序编译中的问题。
本实施例中,在通过返回类型在多个候选函数中确定目标函数时,当多个候选函数中仅存在一个第一函数的返回类型为其余全部候选函数的返回类型的子类型时,则可以确定该第一函数为返回类型最小的函数,进而函数所具有属性方法以及属性也就最多,将这样的第一函数作为目标函数,可以提高所确定的目标函数的准确性。并且,当候选集合中有多个候选函数时,但候选集合中不存在第一函数,或者存在多个第一函数时,均无法在确定出最终的唯一的目标函数,进而,通过上述方法,可以确保最终所能够得到的目标函数,一定是返回类型最小,且唯一的函数,以确保最终确定的目标函数的准确性。并且,上述这种仅参照返回类型在目标函数中进行目标函数确定的方式的处理效率更高,更加适合于有较高函数处理效率需求的场景。
图4为本公开实施例提供的又一种基于函数重载决议的函数处理方法的流程示意图。如图所示,该方法包括以下步骤:
S401、响应于函数调用指令,确定函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,函数调用指令用于指示调用函数;实参类型表征函数调用指令中所包括的待传入待调用函数的实际参数的类型;上下文类型表征函数调用指令所指示的调用结果类型。
S402、根据待调用函数名称、实参类型以及上下文类型,确定函数候选集合;其中,函数候选集合中包括至少一个候选函数,候选函数的名称和待调用函数的名称相同,候选函数的形参类型为实参类型的父类型,候选函数的返回类型为上下文类型的子类型;返回类型表征候选函数的返回值的类型。
示例性地,本实施例中步骤S401与步骤S402,可以参见步骤S201与步骤S202中的描述,此处不再赘述。
S403、若函数候选集合包括多个候选函数,则根据形参类型和返回类型,确定决议结果;其中,决议结果用于指示在函数候选集合中是否可以确定出唯一的目标函数。
示例性地,本实施例中在函数调用过程中,当确定出多个候选函数时,在确定最终的函数决议结果时,此时不仅考虑了候选函数的返回类型,还进一步考虑了候选函数的实参类型。
举例来说,在实际应用中当需要在多个候选函数中确定目标函数时,可以根据各候选函数所对应的返回类型以及形参类型,确定最终的目标函数,例如,若一个候选函数的返回类型是N个其余候选函数的返回类型的子类型,且上述候选函数的形参类型为上述N个其余候选函数的形参类型的子类型,则确定该候选函数为目标函数。其中,N为正整数,N为M除以2后取整的结果。若不存在上述函数,则确定无法确定出唯一的目标函数。
可以理解的是,本实施例中,在多个候选函数中确定目标函数时,不仅考虑了候选函数的返回类型,还考虑了候选函数的形参类型,相比于仅考虑形参类型的目标函数确定方式,本实施例所提供的方式可以筛选出更加准确的目标函数,提高所得到的结果的准确性。
一个示例中,在执行步骤S403中的步骤“根据形参类型和返回类型,确定决议结果”时,可以通过以下步骤实现:
第一步骤:若确定函数候选集合包括第二函数,且第二函数的数量为一个,则确定第二函数为目标函数;第二函数的形参类型为函数候选集合中的其余全部候选函数的形参类型的子类型,且第二函数的返回类型为函数候选集合中的其余全部候选函数的返回类型的子类型。
示例性地,本实施例中,在确定出多个候选函数,并根据候选函数的形参类型和返回类型确定目标函数时,具体地可以采用如下方式实现:在多个候选函数中查找同时满足以下条件的候选函数作为第二函数:候选函数的形参类型为函数候选集合中的其余全部候选函数的形参类型的子类型;返回类型为函数候选集合中的其余全部候选函数的返回类型的子类型。逐一判断多个候选函数是否满足上述条件,即是否可以被作为第二函数。若确定多个候选函数中第二函数的数量为一个,则可以直接确定该第二函数为目标函数。
可以理解的是,本实施例中,同时判断候选函数的形参类型和返回类型,以便可以筛选出更加准确的,具有更多属性和方法的目标函数。进而,提高最终所得到的函数调用结果的准确性。
第二步骤:若确定函数候选集合中不存在第二函数,或者,函数候选集合中包括的第二函数的数量为多个,则确定不存在目标函数。
示例性地,本实施例中,若进一步确定函数候选集合中所包含的多个候选函数中不存在第二函数,或者,存在多个第二函数时,进一步的也无法确定出最终的目标函数,则可以确定决议结果表征的含义为无法确定出目标函数。进而,通过上述方法以确保所确定出的目标函数为唯一的符合上述第一步骤中的条件的函数,即确保最终得到的目标函数更加准确。
一个示例中,在执行上述第二步骤中的“确定函数候选集合中不存在第二函数”包括以下步骤:
第一子步骤:确定候选函数所对应的元组,元组包括候选函数的形参类型和候选函数的返回类型;
第二子步骤:重复以下步骤,直至i的取值大于预设值:针对于第i个元组和第j个元组,若确定第i个元组中存在一个形参类型并非第j个元组中的形参类型的子类型,或者第i个元组中的返回类型并非第j个元组中的返回类型的子类型,则确定第i个元组不是第二函数;令i的取值加1;其中,i为正整数,j为正整数,且i和j的取值不同;预设值为函数候选集合中候选函数的总数量;
第三子步骤:若确定所有候选函数都并非第二函数,则确定函数候选集合中不存在第二函数。
示例性地,本实施例中,在确定候选函数集合中是否存在第二函数时,在实际应用中可以通过以下方式实现:首先确定根据各候选函数所对应的形参类型以及返回类型,确定候选函数对应的元组。即,针对每一候选函数,将该候选函数所对应的各个形参的形参类型以及候选函数的返回类型,作为该候选函数所对应的元组中的参数。之后,针对每一元组,若确定该元组中所包含的任一一个形参类型并非任一其余候选函数所对应的元祖中的形参类型的子类型,或者,确定该元组中所包含的返回类型并非任一其余候选函数所对应的元祖中的返回类型的子类型,则此时表征该元组所对应的候选函数并非第二函数。则可以继续去重复上述步骤判断其余候选函数是否可以作为第二函数,直至候选函数中的所有候选函数都遍历过上述判断过程。
举例来说,用Ti表征第i个候选函数对应的元组,其中,Ti可以用如下方式表示:Ti=(Si0,...,Sim,Ri),其中,m为正数,且取值为第i个候选函数中所包含的形参的总数量取值减1后的值。Sim表征第i个候选函数中所包含的第m+1个形参的形参类型。Ri表征第i个候选函数的返回类型。
对于任一Ti,都需要判断Ti<:T1,...Ti<:Tn是否成立,即确定Ti的形参类型是否为其余全部候选函数的形参类型的子类型,且确定Ti的返回类型是否为其余全部候选函数的返回类型的子类型。其中,符号“<:”所连接的表达式成立,则表征符号前的元组中的各个位置的形参类型为符号后的元组中的各个相对应位置的形参类型的子类型(即,符号前的元组中的首个形参类型为符号后的元组中的首个形参类型的子类型,符号前的元组中的第二个形参类型为符号后的元组中的第二个形参类型的子类型,以此类推),且符号前的元组中的返回类型为符号后的元组中的返回类型的子类型。
可以理解的是,本实施例引用元组来确定候选函数是否为第二函数的过程,相较于不转换为元组方式进行判断的方式,可以提高代码的简洁性,并且,无需将形参类型逐个比较后的结果以及返回类型逐个比较后的结果汇总之后,在确定该函数是否为第二函数。例如,当Ti<:Tj(j是任意不等于i的数字)不成立,则Ti必然不可能作为第二函数,因此,针对Ti的后续检查如Ti<:Tj+1可以被跳过,进而提高决议结果的确定效率。
一个示例中,在执行步骤S403中的步骤“根据形参类型和返回类型,确定决议结果”时,可以通过以下步骤实现:
第一步:若确定函数候选集合中存在多个第一函数,则获取第一函数的形参类型;第一函数的返回类型为函数候选集合中的其余全部候选函数的返回类型的子类型。
示例性地,本实施例中,当确定出的函数候选集合中包括多个候选函数时,在根据候选函数的形参类型以及候选函数的返回类型确定目标函数时,首先可以根据候选函数的返回类型在函数候选集合中查找是否存在第一函数。其中,第一函数为多个候选函数中返回类型为其余全部候选函数的返回类型的子类型的候选函数。
若确定函数候选集合中所包括的多个候选函数中存在多个第一函数,进一步的可以根据各第一函数的形参类型进一步确定目标函数。
第二步:若在多个第一函数中包括第三函数,且第三函数的数量为一个,则确定第三函数为目标函数;第三函数的形参类型为多个第一函数中其余全部第一函数的形参类型的子类型。
示例性地,在多个第一函数中,若第一函数的形参类型为其余全部第一函数的形参类型的子类型,则该第一函数可以作为第三函数。进一步的,若多个第一函数中的第三函数的数量为1个,则可以将第三函数作为目标函数。需要说明的是,在确定第三函数的过程中,需要比对不同函数中相同位置处的形参类型之间的关系,即不同函数所对应的各自的首个形参类型进行比较、不同函数所对应的各自的第二个形参类型进行比较,以此类推,比较相同次序的形参的形参类型。
第三步:若多个第一函数中不存在第三函数,或者,多个第一函数中包括多个第三函数,或者,函数候选集合中不存在第一函数,则确定不存在目标函数。
示例性地,本实施例中,当函数候选集合中的多个第一函数中,根据第一函数的形参类型进行判断之后,确定出多个第一函数中不存在第三函数,或者,多个第一函数中存在多个第三函数时,此时,均认为无法确定出目标函数,进一步可以返回上述实施例中的第一错误信息。此外,若是在多个候选函数中不存在第一函数时,此时,也可以认为不存在目标函数。
第四步:若确定函数候选集合中包括第一函数,且第一函数的数量为一个,则确定第一函数为目标函数。
示例性地,本实施例中,在函数候选集合中确定第一函数时,若函数候选集合所包含的多个候选函数中存在第一函数,且第一函数的数量为一个,则可以直接将该第一函数确定为目标函数。
可以理解的是,本实施例中,在根据候选函数的形参类型和返回类型确定目标函数时,首先可以根据候选函数的返回类型在候选函数中确定第第一函数,若第一函数的数量为多个时,进一步的还可以根据第一函数的形参类型进行目标函数的确定,以便尽可能的返回最准确的目标函数。且,上述先判断返回类型后判断形参类型的目标函数的确定方式,适合于函数式语言这种重视函数返回结果准确性的编程方式。
一个示例中,在执行步骤S403中的步骤“根据形参类型和返回类型,确定决议结果”时,可以通过以下步骤实现:
步骤一:若确定函数候选集合中存在多个第四函数,则获取第四函数的返回类型;第四函数的形参类型为函数候选集合中的其余全部候选函数的形参类型的子类型。
示例性地,本实施例中,当确定出的函数候选集合中包括多个候选函数,在根据候选函数的形参类型以及候选函数的返回类型确定目标函数时,首先可以根据候选函数的返回类型在函数候选集合中查找是否存在第四函数。其中,第四函数为多个候选函数中形参类型为其余全部候选函数的形参类型的子类型的候选函数。
若确定函数候选集合中所包括的多个候选函数中存在多个第四函数,进一步的可以根据各第四函数的返回类型进一步确定目标函数。
需要说明的是,在确定第四函数的过程中,需要比对不同函数中相同位置处的形参类型之间的关系,即不同函数所对应的各自的首个形参类型进行比较、不同函数所对应的各自的第二个形参类型进行比较,以此类推,比较相同次序的形参的形参类型。
步骤二:若在多个第四函数中包括第五函数,且第五函数的数量为一个,则确定第五函数为目标函数;第五函数的返回类型为多个第四函数中其余全部第四函数的返回类型的子类型。
示例性地,在多个第四函数中,若第四函数的返回类型为其余全部第四函数的返回类型的子类型,则该第四函数可以作为第五函数。进一步的,若多个第四函数中的第五函数的数量为1个,则可以将第五函数作为目标函数。
步骤三:若在多个第四函数中不存在第五函数,或者,第五函数的数量为多个,或者,函数候选集合中不存在第四函数,则确定不存在目标函数。
示例性地,本实施例中,当函数候选集合中的多个第四函数中,根据第四函数的返回类型进行判断之后,确定出多个第四函数中不存在第五函数,或者,多个第四函数中存在多个第五函数时,此时,均认为无法确定出目标函数,进一步可以返回上述实施例中的第一错误信息。当函数候选集合中不包含第四函数时,此时也可以认为无法确定目标函数。
步骤四:若确定函数候选集合中包括第四函数,且第四函数的数量为一个,则确定第四函数为目标函数。
示例性地,本实施例中,在函数候选集合中确定第一函数时,若函数候选集合所包含的多个候选函数中存在第一函数,且第一函数的数量为一个,则可以直接将该第一函数确定为目标函数。
可以理解的是,本实施例中,在根据候选函数的形参类型和返回类型确定目标函数时,首先可以根据候选函数的形参类型在候选函数中确定第第四函数,若第四函数的数量为多个时,进一步的还可以根据第四函数的返回类型进行目标函数的确定,以便尽可能的返回最准确的目标函数。且,上述先判断形参类型后判断返回类型的目标函数的确定方式,适合于面向副作用这种重视函数计算过程的编程方式,且该方式相较于相关技术中所提供的重载决议方式改动较小,即,仅需要将确定出多个第四函数时向用户报错的步骤,更改为基于第四函数的返回类型进一步确定是否存在第五函数以及第五函数数量判断的步骤,方便进行重载决议方式的变动,并且,还可提高所确定出的目标函数的准确性。
举例来说,下面提供了五个代码,以及各代码在不同方式下所对应的函数决议结果。
其中,代码段1:
代码段1中,定义了两个函数名为f的同名函数,且,两个函数的形参类型均为int类型。其中,一个函数的返回类型D为另一函数的返回类型C的子类型。代码段中的测试点1表征该代码段用于测试代码段1中的编码方式是否在不同重载决议下是否可以通过。
其中,代码段2:
class C{}
class D:C{}
func f(_x:C)->Int{return 0}
func f(_x:D)->Bool{return false}
let res:Int=f(D())//测试点2
print("Result:",res)
代码段2中,定义了两个函数名为f的同名函数,其中,一个函数的形参类型D为另一函数的形参类型C的子类型,且两个函数的返回类型分别为int类型和bool类型。函数调用指令所指示的上下文类型int类型,实参类型为D。测试点2表征该代码段用于测试在函数调用过程中如何在两个函数f中进行决议。
其中,代码段3:
class C{}
class D:C{}
func f(_x:Int)->C{return C();}
func f(_x:Int)->D{return D();}
let res:C=f(0)//测试点3
print(res)
代码段3中,定义了两个函数名为f的同名函数,且,两个函数的形参类型均为int类型。其中,一个函数的返回类型D为另一函数的返回类型C的子类型。函数调用指令所指示的上下文类型为C类型,实参类型为int类型。测试点3表征该代码段用于测试在函数调用过程中如何在两个函数f中进行决议。
其中,代码段4:
class C{}
class D:C{}
func f(_x:C)->D{return D();}
func f(_x:D)->C{return C();}
let res:C=f(D())//测试点4
print(res)
代码段4中,定义了两个函数名为f的同名函数,其中,第一个函数的返回类型D为第二个函数的返回类型C的子类型;且第二个函数的形参类型D为第一个函数的形参类型C的子类型。函数调用指令所指示的上下文类型C类型,实参类型为D。代码段中的测试点4表征该代码段用于测试在函数调用过程中如何在两个函数f中进行决议。
其中,代码段5:
class C{}
class D:C{}
func f(_x:C)->D{return D();}
func f(_x:D)->D{return D();}
let res:C=f(D())//测试点5
print(res)
代码段5中,定义了两个函数名为f的同名函数,其中,第二个函数的形参类型D为第一个函数的形参类型C的子类型;且两个函数的返回类型均为D。函数调用指令所指示的上下文类型C类型,实参类型为D。代码段中的测试点5表征该代码段用于测试在函数调用过程中如何在两个函数f中进行决议。
上述各代码段在不同决议方式下的测试结果用参照表1中的描述。其中,方式一和方式二分别为相关技术中所提供的两种决议方式,具体地可以参见发明概述中的方式一和方式二的描述,此处不再赘述。方式三可以参见图3中的描述。方式四可以参见图4中的S403下的第一步骤和第二步骤。方式五可以参见图4中的S403下的第一步-第四步。方式六可以参见图4中的S403下的步骤一-步骤四。
表1.测试结果
代码段 | 方式一 | 方式二 | 方式三 | 方式四 | 方式五 | 方式六 |
1 | 报错 | 通过 | 通过 | 通过 | 通过 | 通过 |
2 | 报错 | 第一个 | 第一个 | 第一个 | 第一个 | 第一个 |
3 | 报错 | 报错 | 第二个 | 第二个 | 第二个 | 第二个 |
4 | 第二个 | 第二个 | 第一个 | 报错 | 第一个 | 第二个 |
5 | 第二个 | 第二个 | 报错 | 第二个 | 第二个 | 第二个 |
通过上述比较可以看出,相比于相关技术中所提供的方式一和方式二的两种方法,本公开中所提供的方式三-方式六中的方式中,允许形参类型相同,但返回类型不同的多个同名函数编译通过,有利于增加代码的灵活性。且,在函数重载决议的过程中,在确定出多个候选函数之后,会进一步结合候选函数的返回类型,确定目标函数,以便提高所得到的目标函数的准确性。表格中的第一个和第二个分别表征代码段中同名函数中的第一个函数和第二个函数。
示例性介质
在介绍了本公开示例性实施方式的方法之后,接下来,参考图5对本公开示例性实施方式的存储介质进行说明。
参考图5所示,存储介质50中存储着根据本公开的实施方式的用于实现上述方法的程序产品,其可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本公开的程序产品不限于此。
程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质。
可以以一种或多种程序设计语言的任意组合来编写用于执行本公开公开操作的程序代码,程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备。
示例性装置
在介绍了本公开示例性实施方式的介质之后,接下来,参考图6对本公开示例性实施方式的基于函数重载决议的函数处理装置600进行说明,用于实现上述任一方法实施例中的方法,其实现原理和技术效果类似,在此不再赘述。
如图6所示,本实施例提供了一种基于函数重载决议的函数处理装置的结构示意图,包括:
第一确定模块601,用于响应于函数调用指令,确定函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,函数调用指令用于指示调用函数;实参类型表征函数调用指令中所包括的待传入待调用函数的实际参数的类型;上下文类型表征函数调用指令所指示的调用结果类型。
第二确定模块602,用于根据待调用函数名称、实参类型以及上下文类型,确定函数候选集合;其中,函数候选集合中包括至少一个候选函数,候选函数的名称和待调用函数的名称相同,候选函数的形参类型为实参类型的父类型,候选函数的返回类型为上下文类型的子类型;返回类型表征候选函数的返回值的类型。
第三确定模块603,用于若函数候选集合包括多个候选函数,则根据候选函数的返回类型,确定决议结果;其中,决议结果用于指示在函数候选集合中是否可以确定出唯一的目标函数。
在本公开的一个实施例中,第三确定模块603,包括:
第一确定单元,用于若函数候选集合包括第一函数,且第一函数的数量为一个,则确定第一函数为目标函数,其中,第一函数的返回类型为函数候选集合中的其余全部候选函数的返回类型的子类型。
在本公开的一个实施例中,第三确定模块603,还包括:
第二确定单元,用于若函数候选集合中不存在第一函数,或者,函数候选集合中的第一函数数量为多个,则确定函数候选集合中不存在目标函数。
在本公开的一个实施例中,第三确定模块603,具体用于:
根据形参类型和返回类型,确定决议结果。
在本公开的一个实施例中,第三确定模块603,包括:
第三确定单元,用于若确定函数候选集合包括第二函数,且第二函数的数量为一个,则确定第二函数为目标函数;第二函数的形参类型为函数候选集合中的其余全部候选函数的形参类型的子类型,且第二函数的返回类型为函数候选集合中的其余全部候选函数的返回类型的子类型。
在本公开的一个实施例中,第三确定模块603,还包括:
第四确定单元,用于若确定函数候选集合中不存在第二函数,或者,函数候选集合中包括的第二函数的数量为多个,则确定不存在目标函数。
在本公开的一个实施例中,第四确定单元,具体用于:
确定候选函数所对应的元组,元组包括候选函数的形参类型和候选函数的返回类型;
重复以下步骤,直至i的取值大于预设值:针对于第i个元组和第j个元组,若确定第i个元组中存在一个形参类型并非第j个元组中的形参类型的子类型,或者第i个元组中的返回类型并非第j个元组中的返回类型的子类型,则确定第i个元组不是第二函数;令i的取值加1;其中,i为正整数,j为正整数,且i和j的取值不同;预设值为函数候选集合中候选函数的总数量;
若确定所有候选函数都并非第二函数,则确定函数候选集合中不存在第二函数。
在本公开的一个实施例中,第三确定模块603,包括:
第一获取单元,用于若确定函数候选集合中存在多个第一函数,则获取第一函数的形参类型;第一函数的返回类型为函数候选集合中的其余全部候选函数的返回类型的子类型。
第五确定单元,用于若在多个第一函数中包括第三函数,且第三函数的数量为一个,则确定第三函数为目标函数;第三函数的形参类型为多个第一函数中其余全部第一函数的形参类型的子类型。
在本公开的一个实施例中,第三确定模块603,还包括:
第六确定单元,用于若多个第一函数中不存在第三函数,或者,多个第一函数中包括多个第三函数,或者,函数候选集合中不存在第一函数,则确定不存在目标函数。
在本公开的一个实施例中,第三确定模块603,包括:
若确定函数候选集合中包括第一函数,且第一函数的数量为一个,则确定第一函数为目标函数。
在本公开的一个实施例中,第三确定模块603,还包括:
第二获取单元,用于若确定函数候选集合中存在多个第四函数,则获取第四函数的返回类型;第四函数的形参类型为函数候选集合中的其余全部候选函数的形参类型的子类型。
第八确定单元,用于若在多个第四函数中包括第五函数,且第五函数的数量为一个,则确定第五函数为目标函数;第五函数的返回类型为多个第四函数中其余全部第四函数的返回类型的子类型。
在本公开的一个实施例中,第三确定模块603,还包括:
第九确定单元,用于若在多个第四函数中不存在第五函数,或者,第五函数的数量为多个,或者,函数候选集合中不存在第四函数,则确定不存在目标函数。
在本公开的一个实施例中,第三确定模块603,还包括:
第十确定单元,用于若确定函数候选集合中包括第四函数,且第四函数的数量为一个,则确定第四函数为目标函数。
在本公开的一个实施例中,还包括:
第四确定模块,用于若决议结果表征存在目标函数,则根据目标函数和函数调用指令所对应的实参,确定函数调用结果。
在本公开的一个实施例中,还包括:
返回模块,用于若决议结果表征不存在目标函数,则返回第一错误信息,第一错误信息用于表征无法确定目标函数。
在本公开的一个实施例中,还包括:
第五确定模块,用于若确定函数候选集合中仅包括一个候选函数,则确定候选函数为目标函数。
第六确定模块,用于若确定函数候选集合为空,则返回第二错误信息,第二错误信息用于表征无法获取到候选函数。
示例性计算设备
在介绍了本公开示例性实施方式的方法、介质和装置之后,接下来,参考图7对本公开示例性实施方式的计算设备进行说明。
图7显示的计算设备70仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图7所示,计算设备70以通用计算设备的形式表现。计算设备70的组件可以包括但不限于:至少一个处理单元701、至少一个存储单元702,连接不同系统组件(包括处理单元701和存储单元702)的总线703。其中,至少一个存储单元702中存储有计算机执行指令;至少一个处理单元701包括处理器,处理器执行该计算机执行指令,以实现上文描述的方法。
总线703包括数据总线、控制总线和地址总线。
存储单元702可以包括易失性存储器形式的可读介质,例如随机存取存储器(RAM)7021和/或高速缓存存储器7022,可以进一步包括非易失性存储器形式的可读介质,例如只读存储器(ROM)7023。
存储单元702还可以包括具有一组(至少一个)程序模块7024的程序/实用工具7025,这样的程序模块7024包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
计算设备70也可以与一个或多个外部设备704(例如键盘、指向设备等)通信。这种通信可以通过输入/输出(I/O)接口705进行。并且,计算设备70还可以通过网络适配器706与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图7所示,网络适配器706通过总线703与计算设备70的其它模块通信。应当理解,尽管图中未示出,可以结合计算设备70使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
应当注意,尽管在上文详细描述中提及了基于函数重载决议的函数处理装置的若干单元/模块或子单元/模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多单元/模块的特征和功能可以在一个单元/模块中具体化。反之,上文描述的一个单元/模块的特征和功能可以进一步划分为由多个单元/模块来具体化。
此外,尽管在附图中以特定顺序描述了本公开方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
虽然已经参考若干具体实施方式描述了本公开的精神和原理,但是应该理解,本公开并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本公开旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。
Claims (10)
1.一种基于函数重载决议的函数处理方法,包括:
响应于函数调用指令,确定所述函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,所述函数调用指令用于指示调用函数;所述实参类型表征所述函数调用指令中所包括的待传入所述待调用函数的实际参数的类型;所述上下文类型表征所述函数调用指令所指示的调用结果类型;
根据所述待调用函数名称、所述实参类型以及所述上下文类型,确定函数候选集合;其中,所述函数候选集合中包括至少一个候选函数,所述候选函数的名称和所述待调用函数的名称相同,所述候选函数的形参类型为所述实参类型的父类型,所述候选函数的返回类型为所述上下文类型的子类型;所述返回类型表征所述候选函数的返回值的类型;
若所述函数候选集合包括多个候选函数,则根据所述候选函数的返回类型,确定决议结果;其中,所述决议结果用于指示在所述函数候选集合中是否可以确定出唯一的目标函数。
2.根据权利要求1所述的方法,根据所述候选函数的返回类型,确定决议结果,包括:
若所述函数候选集合包括第一函数,且所述第一函数的数量为一个,则确定所述第一函数为目标函数,其中,所述第一函数的返回类型为所述函数候选集合中的其余全部候选函数的返回类型的子类型。
3.根据权利要求2所述的方法,根据所述候选函数的返回类型,确定决议结果,包括:
若所述函数候选集合中不存在所述第一函数,或者,所述函数候选集合中的第一函数数量为多个,则确定所述函数候选集合中不存在目标函数。
4.根据权利要求1所述的方法,根据所述候选函数的返回类型,确定决议结果,包括:
根据所述形参类型和所述返回类型,确定决议结果。
5.根据权利要求4所述的方法,根据所述形参类型和所述返回类型,确定决议结果,包括:
若确定所述函数候选集合包括第二函数,且所述第二函数的数量为一个,则确定所述第二函数为目标函数;所述第二函数的形参类型为所述函数候选集合中的其余全部候选函数的形参类型的子类型,且所述第二函数的返回类型为所述函数候选集合中的其余全部候选函数的返回类型的子类型。
6.根据权利要求5所述的方法,根据所述形参类型和所述返回类型,确定决议结果,包括:
若确定所述函数候选集合中不存在第二函数,或者,所述函数候选集合中包括的第二函数的数量为多个,则确定不存在目标函数。
7.根据权利要求6所述的方法,确定所述函数候选集合中不存在第二函数,包括:
确定候选函数所对应的元组,所述元组包括所述候选函数的形参类型和所述候选函数的返回类型;
重复以下步骤,直至i的取值大于预设值:针对于第i个元组和第j个元组,若确定所述第i个元组中存在一个形参类型并非所述第j个元组中的形参类型的子类型,或者所述第i个元组中的返回类型并非所述第j个元组中的返回类型的子类型,则确定所述第i个元组不是第二函数;令i的取值加1;其中,i为正整数,j为正整数,且i和j的取值不同;所述预设值为所述函数候选集合中候选函数的总数量;
若确定所有候选函数都并非第二函数,则确定所述函数候选集合中不存在第二函数。
8.一种基于函数重载决议的函数处理装置,包括:
第一确定模块,用于响应于函数调用指令,确定所述函数调用指令所指示的待调用函数的名称、实参类型以及上下文类型;其中,所述函数调用指令用于指示调用函数;所述实参类型表征所述函数调用指令中所包括的待传入所述待调用函数的实际参数的类型;所述上下文类型表征所述函数调用指令所指示的调用结果类型;
第二确定模块,用于根据所述待调用函数名称、所述实参类型以及所述上下文类型,确定函数候选集合;其中,所述函数候选集合中包括至少一个候选函数,所述候选函数的名称和所述待调用函数的名称相同,所述候选函数的形参类型为所述实参类型的父类型,所述候选函数的返回类型为所述上下文类型的子类型;所述返回类型表征所述候选函数的返回值的类型;
第三确定模块,用于若所述函数候选集合包括多个候选函数,则根据所述候选函数的返回类型,确定决议结果;其中,所述决议结果用于指示在所述函数候选集合中是否可以确定出唯一的目标函数。
9.一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如权利要求1至7中任一项所述的方法。
10.一种计算设备,包括:
至少一个处理器;
以及与所述至少一个处理器通信连接的存储器;
其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述计算设备执行如权利要求1至7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310571314.6A CN116594716A (zh) | 2023-05-16 | 2023-05-16 | 基于函数重载决议的函数处理方法、介质及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310571314.6A CN116594716A (zh) | 2023-05-16 | 2023-05-16 | 基于函数重载决议的函数处理方法、介质及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116594716A true CN116594716A (zh) | 2023-08-15 |
Family
ID=87605853
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310571314.6A Pending CN116594716A (zh) | 2023-05-16 | 2023-05-16 | 基于函数重载决议的函数处理方法、介质及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116594716A (zh) |
-
2023
- 2023-05-16 CN CN202310571314.6A patent/CN116594716A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111104335B (zh) | 一种基于多层次分析的c语言缺陷检测方法及装置 | |
CN112100072B (zh) | 应用程序代码的静态检测方法、装置、设备及介质 | |
CN111881022A (zh) | 基于测试场景生成测试用例的方法、装置和设备 | |
CN110543356A (zh) | 异常任务检测方法、装置、设备及计算机存储介质 | |
CN110688111A (zh) | 业务流程的配置方法、装置、服务器和存储介质 | |
CN111814449B (zh) | 表单解析方法、装置、设备及存储介质 | |
CN115659335A (zh) | 基于混合模糊测试的区块链智能合约漏洞检测方法及装置 | |
CN117556008A (zh) | 基于大语言模型的交互方法、介质、装置和计算设备 | |
CN117608630A (zh) | 一种代码质量检测方法、装置、设备和存储介质 | |
CN113901083A (zh) | 基于多解析器的异构数据源操作资源解析定位方法和设备 | |
CN110175128B (zh) | 一种相似代码案例获取方法、装置、设备和存储介质 | |
US9367307B2 (en) | Staged points-to analysis for large code bases | |
CN113934631A (zh) | 一种基于蜕变关系匹配的组合测试方法 | |
US10152407B1 (en) | Optimization of analysis of automated test results | |
CN116594716A (zh) | 基于函数重载决议的函数处理方法、介质及装置 | |
CN115994093A (zh) | 测试用例推荐方法和装置 | |
CN110716859A (zh) | 自动为修改的代码推送测试用例的方法及相关装置 | |
CN115292178A (zh) | 测试数据搜索方法、装置、存储介质以及终端 | |
CN115934502A (zh) | 用于大数据管理系统的最优压力测试的工作负载生成 | |
CN110727428B (zh) | 一种转换业务逻辑层代码的方法、装置和电子设备 | |
CN115033434A (zh) | 一种内核性能理论值计算方法、装置及存储介质 | |
US8010477B2 (en) | Integrated problem solving system | |
CN110825608B (zh) | 关键语义测试方法、装置、存储介质及电子设备 | |
CN118132448B (zh) | 测试用例处理方法、装置、计算机设备和存储介质 | |
CN116540997B (zh) | 数据类型声明方法、介质、装置和计算设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information | ||
CB02 | Change of applicant information |
Address after: 310052 Room 301, Building No. 599, Changhe Street Network Business Road, Binjiang District, Hangzhou City, Zhejiang Province Applicant after: Hangzhou NetEase Shuzhifan Technology Co.,Ltd. Address before: 310052 Room 301, Building No. 599, Changhe Street Network Business Road, Binjiang District, Hangzhou City, Zhejiang Province Applicant before: HANGZHOU LANGHE TECHNOLOGY Ltd. |