呼叫在另一个物件中的函式.
语法:
unknown call_other( object ob | object *obs,string func | mixed *args, ... );
未知 call_other( 物件 ob 或 物件 *obs,字串 func 或 混合 *args, ... );
用法:
用可以选择的参数 (argument) 呼叫另一个物件中的函式.传回值要视被呼叫的函式而定, 所以使用此一函式时最好检查传回值. func 是物件 ob 中被呼叫的函式名称, 而第三个、第四个... 等等的参数, 则会传入 func 中, 当成 func 的第一个、第二个参数. 在 call_other() 中,如果第一个参数是一个物件阵列, call_other() 就会逐一呼叫它们, 而传回值也会变成一个阵列. 如果第二个参数是一个阵列, 那阵列中的第一个元素 (element) 必须是一个字串 (即要呼叫的函式) , 而其他的元素就会被当成要传入此函式的参数.
这里有个使用 call_other() 更好的方法:
object ob 或 object *obs -> func( ... );
□例:call_other( ob, "query", "name" );可以写成ob->query("name");
如果 call_other() 的第二的参数是一个阵列, 也可以把上例写成:call_other( ob, ({ "query", "name" }));
这里有一个使用阵列的□例:users()->quit();
翻译:Spock @ FF 96.Oct.16. (printed 3/16/95)
延迟呼叫同一个物件中的函式.
语法:
void call_out( string | function fun, int delay,mixed arg );
无传回值 call_out( 字串 或 函式 fun, 整数 delay,混合 arg );
用法:
设定在 this_object() 中, 延迟 delay 秒呼叫函式 fun.而 arg 当作参数传入 fun 中.
请注意, 你不能在 fun 中呼叫 write() 或 say(), 因为this_player() 被设定成 0. 你可以用 tell_object()代替.
如果在 driver 的 options.h 中定义THIS_PLAYER_IN_CALL_OUT, 就可以解决这个问题.
参考:
remove_call_out(),call_out_info()
翻译:Spock @ FF 96.Oct.16. (printed 3/16/95)
找出函式运作的错误.
语法:
mixed catch( mixed expr );
混合 catch( 混合 expr );
用法:
处理 expr 式子. 如果没有出错就传回 0 , 如果有标准错误, 则传回一个第一个字元是 * 的字串.
函式 throw() 也可以用来马上传回任何非零值. catch()实际上并不是真正的函式呼叫, 而是编译器 (compiler)的一个指令.
catch() 有点耗费系统资源, 请您别到处用它. 把 catch()放在出错时可能会摧毁系统结构 (consistency) 的地方.
参考:
error(),throw(),error_handler()
翻译:Spock @ FF 96.Oct.24. (printed 3/16/95)
判断目前的函式是如何被呼叫的.
语法:
int origin( void );
整数 origin( 无参数 );
用法:
传回一个整数值, 指出目前的函式是如何被呼叫的.传回值代表的意义如下:
1 驱动程式 (driver) (heart_beats, 其他)
2 区域函式的呼叫 (local function call)
4 call_other()
8 simul_efun 物件, 经由 simul_efun 呼叫
16 call_out()
32 被超越函式 (efun) 呼叫 (sort_array, 其他)
参考:
previous_object(),/include/origin.h
翻译:Spock @ FF 97.Apr.24. (printed 3/16/95)
传回呼叫目前这个函式的物件(或物件列表).
语法:
mixed previous_object( int | void );
混合 previous_object( 整数 或 无参数 );
用法:
传回一个呼叫目前函式之物件的物件指标. 请注意, 区域函式(local function) 的呼叫不会让 previous_object() 设定为目前的物件, 不会改变 previous_object() 传回的物件.如果指定一个正整数为参数, 就传回先前第几个呼叫的物件.previous_object(0) 如同 previous_object(),previous_object(1) 是 previous object 的previous_object(), 以此类推. previous_object(-1) 则传回所有的 previous object 阵列.
参考:
call_other(),call_out(),origin()
翻译:Spock @ FF 97.Apr.24. (printed 3/16/95)
#
说明:
如果没有参数,则会传回 this_object() 的原物件,否则会传回物件 ob 的原物件。
如果物件 ob (参数为 ob)或者 this_object() (无参数)不是阻隔物件,则传回 0。
说明:
此处“原物件”是指被 this_object()(无参数)或者被物件 ob (有参数) 所阻隔的物件。
由于原 MudOS 的 shadow 部分有些不合理,使用不方便,而且存在安全隐患,因此这部分的程序重新写过,shadow 部分的函数的使用和原 MudOS 提供的函数有很大的不同,如要在其它 MudOS 支持的游戏中使用 shadow
取消一个延迟中的外部呼叫 (call_out).
语法:
int remove_call_out( string fun );
整数 remove_call_out( 字串 fun );
用法:
取消目前这个物件延迟呼叫的外部呼叫函式 fun. 传回值就是外部呼叫还剩下多少延迟时间. 如果函式 fun 已经没有延迟的外部呼叫, 就传回 -1.
参考:
call_out(),call_out_info().
翻译:Spock @ FF 97.May.27. (printed 3/16/95)
设定自己的阻隔物件。
说明:
将物件 ob 设定为 this_object() 的阻隔物件。
传回值为 1,则阻隔设定成功,0 设定失败。
valid_shadow() 函数由 MASTER_OB 物件定义。
如果valid_shadow() 传回 1, 则阻隔被允许, 否则阻隔设定失败。
如果物件 b 是物件 a 的阻隔物件,物件 a 叫做物件 b 的原物件。
所有对原物件 a 的 call_other(func)函数呼叫,都会被都会被重定向到首先尝试呼叫物件b 中的函数 func,如果物件 b 中不存在名为 func的函数,才会再尝试呼叫物件 a 中的名为 func 的函数。
只有阻隔物件才能用 call_other(func) 直接呼叫原物件的函数。
原物件无法以 call_other() 直接呼叫自己中的函数,原物件中的内部函数呼叫都会被限定在物件内部本身。
摧毁原物件,其阻隔物件会自动被摧毁。
阻隔物件可以单独摧毁,这时原物件就相当于没有设定过阻隔物件。
利用这个函数,可以在不增加一个物件代码的情况下,扩展一些其他的功能。
尤其可以在运行过程中,灵活的增加、去除一些特殊的功能。
不过,非要利用“阻隔”其他方法无法替代的情况是很少的。
说明:
由于原 MudOS 的 shadow 部分有些不合理,使用不方便,而且存在安全隐患,因此这部分的程序重新写过,shadow 部分的函数的使用和原 MudOS 提供的函数有很大的不同,如要在其它 MudOS 支持的游戏中使用 shadow
传回呼叫此函式物件的物件指标
说明:
传回这个物件的物件指标. 如果想呼叫同一个物件却非同一个程式码档案的函式时 (即呼叫所继承 (inherite) 物件的函式), 可用 this_object()达到目的
强制一个物件产生错误.
说明:
throw()可以用於强制一个物件产生错误. 当 throw()和catch()两者一起使用时, 让程式设计者可以设计发生编译时段错误时 (runtime error) 显示何种错误讯息. 当使用throw() 时, 应一起使用 catch() 函式. 以下为典型的用法:
string err;int rc;err = catch(rc = ob->move(dest));if (err) {throw("move.c:
ob->move(dest):
" + err + "\n");return;