第三十三章 Objects - OREFs
OREFs
对象类的 %New() 方法创建一个内部内存结构来包含对象的数据,并返回指向该结构的 OREF(对象引用)。 OREF 是 IRIS 中的一种特殊值。应该记住以下几点:
- 在终端中,
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或者使用了错误类型的OREF,IRIS将返回错误。此错误与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。