You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ooRexx中向函数传递对象?资深主机Rexx开发者求教

嘿,作为长期搞主机Rexx的老伙计,我太懂刚转ooRexx时踩的坑了!你的问题核心是类定义里有几个关键错误,导致对象没正确初始化,进而传递给过程时出了意料之外的问题。咱们一步步来解决:

先修复你的number类的问题

你的类代码里有两个致命错误,这是一切异常的根源:

  1. 错误重写了new方法:ooRexx里new是类的内置类方法,负责创建实例并自动调用init方法。你自定义的new是实例方法(默认),逻辑完全不对——删掉这个自定义的new方法,让系统默认的new工作就好。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:27:45