如何在ooRexx中向函数传递对象?资深主机Rexx开发者求教
嘿,作为长期搞主机Rexx的老伙计,我太懂刚转ooRexx时踩的坑了!你的问题核心是类定义里有几个关键错误,导致对象没正确初始化,进而传递给过程时出了意料之外的问题。咱们一步步来解决:
先修复你的number类的问题
你的类代码里有两个致命错误,这是一切异常的根源:
- 错误重写了
new方法:ooRexx里new是类的内置类方法,负责创建实例并自动调用init方法。你自定义的new是实例方法(默认),逻辑完全不对——删掉这个自定义的new方法,让系统默认的new工作就好。 string方法不完整:当你直接say一个对象时,ooRexx会调用它的string方法获取字符串表示。你写的return "'"self~...没写完,这会导致语法错误或者返回异常值,让你误以为对象传递有问题。
修正后的number类应该是这样:
::class number public ::attribute val get public ::method init expose val use arg val ::method string return self~val // 直接返回val的值,这样say对象时就显示数值
正确实现对象向函数(过程)的传递
在ooRexx里,把对象传递给传统的procedure标记的过程完全没问题,只要对象本身是有效的。现在把你的完整代码修正后,就能正常工作了:
#!/usr/bin/rexx a = .number~new(3.14) say "a =" a say "a~val =" a~val call say_number a exit 0 say_number: procedure parse arg num say "In say_number" say "num =" num say "num~val =" num~val return ::class number public ::attribute val get public ::method init expose val use arg val ::method string return self~val
运行这段代码,你会看到输出完全符合预期:对象被正常传递给say_number过程,并且能正确调用val属性。
额外的小技巧
如果想更严谨地处理参数,可以在过程里检查传入的是否是目标类的实例,避免非对象参数导致的错误:
say_number: procedure parse arg num if num~isInstanceOf(.number) then do say "Received a valid number object" say "num~val =" num~val end else do say "Oops, that's not a number object!" end return
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

