5.3.1 Self:记录背后的魔法
假设您有两个记录,如MyRec1
和MyRec2
,它们属于相同的记录类型。当调用一个方法并执行其代码时,该方法如何知道它使用这两个记录中的哪一个?当您定义一个方法时,编译器在幕后向方法添加一个隐藏的参数,即对您应用该方法的记录的引用。
换句话说,对方法的上述调用被编译器转换为以下伪代码:
// 您编写的代码
MyRec.SetValue('Hello');
// 编译器生成的代码
SetValue(@MyRec, 'Hello');
在这个伪代码中,@
是地址运算符,用于获取记录实例的内存位置。
小贴士: 地址运算符在本章的高级部分末尾简要介绍了一下,标题为“指针是怎么样的?”
调用代码是这样翻译的,但实际方法调用如何引用和使用这个隐藏参数呢?通过隐式使用一个名为 Self 的特殊标识符。因此,该方法的代码可以写成:
procedure TMyRecord.SetValue(NewString: string);
begin
Self.FName := NewString;
end;
虽然这段代码可以编译,但显式地使用 Self
并没有什么意义,除非你需要将记录作为一个整体来引用,例如将记录作为参数传递给另一个函数。这种情况更经常发生在类中,因为这些类的方法具有相同的隐藏参数和相同的 Self
标识符。
使用显式 Self
参数可以使代码更可读(即使不是必需的)的一种情况是,当你在操作第二个相同类型的数据结构时,如同类型的第二个数据结构时,如测试另一个实例的值:文章来源:https://www.toymoban.com/news/detail-829248.html
function TMyRecord.IsSameName(ARecord: TMyRecord): Boolean;
begin
Result := Self.FName = ARecord.FName;
end;
小贴士: “隐藏的”
Self
参数在C++和Java中称为this
,但在Objective-C(以及Object Pascal中)中称为Self
。文章来源地址https://www.toymoban.com/news/detail-829248.html
到了这里,关于【无标题】(delphi11最新学习资料) Object Pascal 学习笔记---第5章第3节(self关键字)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!