文章
· 九月 20, 2023 阅读大约需 2 分钟

第三十二章 Objects

[toc]

第三十三章 Objects - OREFs

OREFs

对象类的 %New() 方法创建一个内部内存结构来包含对象的数据,并返回指向该结构的 OREF(对象引用)。 OREFIRIS 中的一种特殊值。应该记住以下几点:

  • 在终端中,OREF 的内容取决于所使用的语言:
    • ObjectScript 中,会看到一个由数字、@ 符号和类名称组成的字符串。
    • Python 中,会看到一个包含类名和内存中 18 个字符的唯一位置的字符串。

例如:

TESTNAMESPACE>set myobj=##class(Sample.Person).%New()

TESTNAMESPACE>w myobj
3@Sample.Person 
>>> myobj=iris.cls("Sample.Person")._New()
>>> print(myobj)
<iris.Sample.Person object at 0x000001A1E52FFD20>
  • 如果没有使用预期的 OREF 或者使用了错误类型的 OREFIRIS 将返回错误。此错误与 ObjectScript 终端和 Python 终端不同:
TESTNAMESPACE>set x=2

TESTNAMESPACE>set x.Name="Fred Parker"

SET x.Name="Fred Parker"
^
<INVALID OREF>
>>> x=2
>>> x.Name="Fred Parker"
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'int' object has no attribute 'Name'

认识到这种错误是有帮助的。这意味着变量不是OREF,但应该是OREF

  • 创建 OREF 只有一种方法:使用返回 OREF 的方法。返回 OREF 的方法在对象类或其子类中定义。

下面的代码不会创建OREF,而是创建一个看起来像OREF的字符串:

TESTNAMESPACE>set testthis="4@Sample.Person"
>>> testthis="<iris.Sample.Person object at 0x000001A1E52FFD20>"
  • ObjectScript中,可以通过编程确定变量是否包含OREF。如果变量包含OREF,函数$IsObject返回1 (true);否则返回0 (false)。

注意:对于持久化类,像%OpenId()这样的方法也会返回oref。

讨论 (0)1
登录或注册以继续