提问人:Konrad Eisele 提问时间:7/24/2020 最后编辑:jjmereloKonrad Eisele 更新时间:7/25/2020 访问量:150
是否有一些模型可用于理解 Raku 中的容器、引用、raw、rw、\?
Is there some model to use to understand containers, references, raw, rw, \ in Raku?
问:
在 perl5 中,您可以将其视为指针,并通过在前缀中加上特定的 sigil 或 来取消引用该指针。您还具有使符号显式的类型球。在 perl5 中,底层的 C 代码结构将提供一个很好的模型来与语言的语法相关联。\
->
在 Raku 中,你有一组概念,例如:容器(和非容器?)、绑定、与 and 的赋值、参数中的不同特征,如 and(这似乎与 perl5 的 ?)。=
:=
raw
rw
\
\
是否有一些基础模型可用于确定我在代码中的某个点实际使用的内容以及我有哪些选项?
答:
好的,我试着给你一个心智模型:
- Raku 中没有真正的赋值,只有绑定(如 NQP)
- Raku 中的一切都是一个对象。
- 对象可以具有可以绑定到其他对象的属性。
- Raku 添加了语法糖来编写赋值,但实际上这只是将对象绑定到 Container 对象的属性。
那么这意味着什么呢?
# bind a container object to the name '$a' in the lexpad
my $a;
# bind an Int object to the value attribute of that container
$a = 42;
通常,您不需要知道容器内是否有东西,因为大多数解箱都是在幕后为您完成的。例如,如果从子例程返回变量,则会自动将其从其容器中删除。除非子例程标记为 。is raw
这对创建模型有帮助吗?
评论
我喜欢关于这个主题的降临节日历文章 https://perl6advent.wordpress.com/2017/12/02/perl-6-sigils-variables-and-containers/ ,不确定这是否是你要找的,但它帮助我更好地了解正在发生的事情......
评论
当你写这个的时候:
my $a = 'b';
$a = 'c';
say $a;
发生的事情是这样的:
my $a := Scalar.new( value => 'b' );
$a.set-value('c');
say $a.get-value();
基本上,将创建一个新的 Scalar 对象,并且是指向它的指针。$a
当然,这并不是那么简单,因为你甚至不能调用标量并让它做任何事情。.new
Scalar 对象内部还存储了更多信息。 例如,类型信息和任何默认值。
实际上,你对变量的看法都包含在 Scalar 对象中。$
通常,此容器尝试完全透明。
但是,您可以使用方法/宏获取 Scalar 对象。.VAR
my Int $a is default(42) = 3;
my $var = $a.VAR;
say $var.name; # $a
say $var.of; # (Int)
say $var.default; # 42
say $var.self; # 3
还有其他方法可以使这种透明度比透明更透明。
sub foo ( \v ){ # the \ is so it isn't seen as a Type name
say v.VAR.name
v = 22;
}
foo $a; # $a
say $a; # 22
这是因为 Scalar 被传递给子例程,而不是 Scalar 内部的值。 Scalar 总是传递给函数调用,只是函数经常决定做一些事情,而不是允许您原始访问原始 Scalar。
在下文中,传递的 Scalar 内部的值将复制到不允许修改的新 Scalar 中。
sub bar ( $v ){
# $v = 3; # ERROR
}
bar $a
如果声明为 或,则实际上是指向您传入的 Scalar 容器的指针,就像上面一样。( 与 非常相似。$v
is rw
is raw
$v
\v
\v
is raw
评论