ref 对象如何在 Nim 中工作以及新构造函数和普通构造函数之间的区别
How do ref objects work in Nim and difference between new and common constructor
我试图理解 Nim 中的引用,将 ref 与 C 中的指针进行比较(我知道我不应该比较这两种语言,但我通过这种方式理解得更好)。然后我想到了一些事情...... ref 对象总是分配在堆中吗?他们不会创建一个对象然后指向它,对吧?
type
Person = object
value: int
PersonRef = ref Person
var obj1 = PersonRef(value: 1)
var obj2: PersonRef
new(obj2)
这段 Nim 代码应该与这段 C 代码相似?
#include <stdlib.h>
struct Person {
int value;
}
typedef struct Person* PersonRef;
int main() {
PersonRef obj1 = malloc(sizeof(struct Person))
}
回顾一下,我的问题是:
- ref 对象总是分配在堆中吗?
- 新对象构造函数和普通对象构造函数之间的真正区别是什么(在 ref 对象 ofc 中)
- 此时,var参数修饰符是否只是对我们标记为var的对象的引用
对不起,我可能不是巧合的问题,但我很匆忙
I was trying to understand references in Nim
你读过什么?许多教程和一些视频中都解释了该主题。我的解释位于
http://ssalewski.de/nimprogramming.html#_value_objects_and_references
这是您可能打算阅读的几页,最后一节
http://ssalewski.de/nimprogramming.html#_references_to_objects
如果你真的应该仔细阅读,但仍有不清楚的地方,请在 https://github.com/StefanSalewski/NimProgrammingBook 创建一个问题如果这对你来说不可能,那么你也可以给我发一封私人电子邮件。
[编辑]
好的,刚刚找到对象引用的视频,还是很新鲜的。这是此列表中的最后一个:
https://www.youtube.com/playlist?list=PLvwc2YT9MFOlPPexrsY-t7BNTdg2Vsx06
我不确定它对你的问题的解释有多好,我自己还没有真正看过。我发现视频系列从 https://nim-lang.org/documentation.html 开始,其中列出了更多教程。
对于你的具体问题:Nim 引用是托管指针,实际上 Nim 引用引用的值是在堆上分配的,使用 new() 或“构造函数” MyType(myField: myValue) 或专用构造函数,如新按钮()。请注意,Nim 没有像 C++ 那样的真正的构造函数。像 newButton() 这样的函数名称只是一个约定,该函数可以初始化对象。初始化位于堆栈上的值对象的函数通常称为 initMyType(),但这只是一个约定。调用 new() 或类型名称类似于 MyType(myField: myValue) 的函数是类似的,但 new 总是在堆上分配一个具有默认(二进制零)内容的实例,而 MyType() 调用可用于值或引用对象,最重要的是可以初始化字段。所以 new() 有点多余,我看到过关于为 Nim 2.0 删除 new() 的讨论。对于您的其他问题,例如过程参数的 var 关键字——好吧,所有这些在各种教程中都有解释,更详细、更好的措辞和更少的错误,如本文所示。
对不起,我可能不是巧合的答案,但我很匆忙:-)
我试图理解 Nim 中的引用,将 ref 与 C 中的指针进行比较(我知道我不应该比较这两种语言,但我通过这种方式理解得更好)。然后我想到了一些事情...... ref 对象总是分配在堆中吗?他们不会创建一个对象然后指向它,对吧?
type
Person = object
value: int
PersonRef = ref Person
var obj1 = PersonRef(value: 1)
var obj2: PersonRef
new(obj2)
这段 Nim 代码应该与这段 C 代码相似?
#include <stdlib.h>
struct Person {
int value;
}
typedef struct Person* PersonRef;
int main() {
PersonRef obj1 = malloc(sizeof(struct Person))
}
回顾一下,我的问题是:
- ref 对象总是分配在堆中吗?
- 新对象构造函数和普通对象构造函数之间的真正区别是什么(在 ref 对象 ofc 中)
- 此时,var参数修饰符是否只是对我们标记为var的对象的引用
对不起,我可能不是巧合的问题,但我很匆忙
I was trying to understand references in Nim
你读过什么?许多教程和一些视频中都解释了该主题。我的解释位于
http://ssalewski.de/nimprogramming.html#_value_objects_and_references
这是您可能打算阅读的几页,最后一节
http://ssalewski.de/nimprogramming.html#_references_to_objects
如果你真的应该仔细阅读,但仍有不清楚的地方,请在 https://github.com/StefanSalewski/NimProgrammingBook 创建一个问题如果这对你来说不可能,那么你也可以给我发一封私人电子邮件。
[编辑]
好的,刚刚找到对象引用的视频,还是很新鲜的。这是此列表中的最后一个:
https://www.youtube.com/playlist?list=PLvwc2YT9MFOlPPexrsY-t7BNTdg2Vsx06
我不确定它对你的问题的解释有多好,我自己还没有真正看过。我发现视频系列从 https://nim-lang.org/documentation.html 开始,其中列出了更多教程。
对于你的具体问题:Nim 引用是托管指针,实际上 Nim 引用引用的值是在堆上分配的,使用 new() 或“构造函数” MyType(myField: myValue) 或专用构造函数,如新按钮()。请注意,Nim 没有像 C++ 那样的真正的构造函数。像 newButton() 这样的函数名称只是一个约定,该函数可以初始化对象。初始化位于堆栈上的值对象的函数通常称为 initMyType(),但这只是一个约定。调用 new() 或类型名称类似于 MyType(myField: myValue) 的函数是类似的,但 new 总是在堆上分配一个具有默认(二进制零)内容的实例,而 MyType() 调用可用于值或引用对象,最重要的是可以初始化字段。所以 new() 有点多余,我看到过关于为 Nim 2.0 删除 new() 的讨论。对于您的其他问题,例如过程参数的 var 关键字——好吧,所有这些在各种教程中都有解释,更详细、更好的措辞和更少的错误,如本文所示。
对不起,我可能不是巧合的答案,但我很匆忙:-)