Bre*_*tin 0 vbscript fluent-interface method-chaining asp-classic jscript
我试图为传统的经典ASP应用程序带来一些理智,作为其中的一部分,我正在尝试为我创建的一些JScript类编写Fluent API.
例如 myClass().doSomething().doSomethingElse()
这是我的示例JScript类:
var myClass = function () {
this.value = '';
}
myClass.prototype = function () {
var doSomething = function (a) {
this.value += a;
return this;
},
doSomethingElse = function (a, b) {
this.value += (a + b);
return this;
},
print = function () {
Response.Write('Result is: ' + this.value + "<br/>");
}
return {
doSomething: doSomething,
doSomethingElse: doSomethingElse,
print: print
};
}();
/// Wrapper for VBScript consumption
function MyClass() {
return new myClass();
}
Run Code Online (Sandbox Code Playgroud)
在现有的VBScript代码中,我正在尝试将这些方法链接在一起:
dim o : set o = MyClass()
'' This works
o.doSomething("a")
'' This doesn't work
o.doSomething("b").doSomethingElse("c", "d")
'' This for some reason works
o.doSomething("e").doSomethingElse("f", "g").print()
Run Code Online (Sandbox Code Playgroud)
当函数有多个参数时,我得到" Cannot use parentheses when calling a Sub"VBScript错误.奇怪的是,当它跟着另一种方法时似乎有效.
我知道在调用sub时应该省略括号.然而:
1.如果有返回值,为什么它被识别为Sub?
2.有什么方法可以实现我的Fluent API吗?
规则是:当将"命名的代码片段" 作为子句调用时,没有参数列表().令人讨厌的陷阱是:对于单个参数npcs,()可能看起来像param list(),但是(解释为)pass-me-by-value().
你的set o = MyClass()MyClass()作为一个函数调用; 从作业中可以清楚地看出来.
你的o.doSomething("a")调用.doSomething as sub,()被视为pass-me-per-value(); doSomething "a"这将是正确的电话.
你的o.doSomething("b").doSomethingElse("c", "d")作品的第一部分,因为o.doSomething("b").是/使用函数调用来获取一个.doSomethingElse()被调用的对象; 第二部分.doSomethingElse("c", "d")不能工作,因为它不是一个子调用(没有使用/赋值的返回值),并且()不能被视为pass-me-by-value().o.doSomething("b").doSomethingElse "c", "d"会是对的.
第一部分o.doSomething("e").doSomethingElse("f", "g").print()(直到.print)是一个函数调用(获取将.print的对象),所以()是param list(); .print之后的()是错误的,但编译器/解释器让它们溜走了.
总结一下:当你不想要某些东西时,不要使用().
WRT评论:
换句话说:当你想要回复时使用()!
set o1 = MyClass() < - 返回值应该进入o1
set o2 = o.S(1, 2).S(3, 4).S(5, 6)< - 下一次调用需要/使用前两个返回值; 最后一个返回值进入o2.
o.S(1, 2).S(3, 4).S 5, 6 < - 最后一个返回值被丢弃 - 没有子调用
()规则是关于你做什么的(使用或不使用返回值),而不是关于npc 是什么.