我正在使用ActionScript编写自己的语言作为个人项目(是的,我认为AS3不是构建语言的最佳语言,但更不用说了。)
注意:我已多次检查过,我的编译器选项“启用严格模式”设置为True
。我已尝试将其设置为False
以尝试,但我没有得到不同的结果。
无论如何,我有一个:
package NodyCode.Classes
{
public class NCString
{
var value:String;
public function NCString(expression:String = "") {
value = expression;
}
public function rindex(substr:NCString, startIndex:int = 0x7fffffff):uint {
//code here
}
}
}
由于我正在编写自己的语言,因此我需要确保函数和方法可以使用无限数量的参数。出于这个原因,我使用匿名函数,以便我可以使用apply
方法。像这样:
//This code is in a class named ClassMethods
public static var StringMethods:Object = {
rindex: function(substr:NCString, startIndex:int = 0x7fffffff):uint {
return this.rindex(substr, startIndex);
}
}
而且,在我的代码的其他地方,我接听电话:
return ClassMethods.StringMethods["rindex"].apply(ncstr1, [ncstr2, [5]]);
每当用户使用错误类型的参数时,我都希望抛出一个错误。
因此,在这种情况下,我在rindex
上使用参数:ncstr1
和substr = ncstr2
调用startIndex = [5]
方法。请注意,根据我的匿名函数的定义,startIndex
应该是int
,不是和Array
。
所以,我预计会抛出一个错误。但是,使用rindex
调用startIndex = 5
。
为什么[5]
转换为5
,有什么方法可以防止这种情况发生?如果没有,我可以随时解决这个问题,但如果我不这样做,我宁愿不这样做。
编辑:最后明白我没有提到我使用的是匿名函数。
答案 0 :(得分:0)
您是否将difftime()'s man page设置为false进行编译? (见strict mode。)
double
选项:“打印未定义的属性和函数调用;还对提供给方法调用的赋值和选项执行编译时类型检查”。
默认为true,但如果以某种方式将其设置为false,则可能会禁用编译时检查。我会检查你的编译器设置(无论是在IDE中还是在命令行上进行编译),并确保它们是正确的。
答案 1 :(得分:0)
好的,这就是评论中所说的内容:
我确实在strict
模式下使用了我的编译器。我没有收到错误的原因是因为我使用的是匿名函数的apply
方法。使用apply
方法时,类型检查会松动。这就是为什么[5]
被强制转移到5
的原因。
显然没有办法阻止这种情况。