您好、欢迎来到现金彩票网!
当前位置:21点 > 子例程 >

Perl 6 中的变量

发布时间:2019-06-27 05:03 来源:未知 编辑:admin

  变量名以一个叫做魔符 sigil 的特殊字符开头, 后面跟着一个可选的第二个叫做

  有两种类型的赋值, item 赋值和 list 赋值. 两者都使用 = 号操作符. 根据 = 号左边的语法来区别 = 是 item 赋值还是 list 赋值.

  例如,数组变量(@符号)在列表赋值时清空数组自身, 然后把等号右侧的值都放进数组自身中. 跟 Item 赋值相比, 这意味着等号左侧的变量类型始终是 Array, 不管右侧是什么类型.

  赋值类型(item 或 list)取决于当前表达式或声明符看到的第一个上下文:

  例如, 如果内部赋值是一个声明符(例如 my), 就使用 item 赋值, 它比逗号和列表赋值的优先级更高:

  类似地, 如果内部赋值是一个用于声明符初始化的表达式, 则内部表达式的上下文决定赋值的类型:

  然而, 如果内部赋值既不是声明符又不是表达式, 而是更大的表达式的一部分, 更大的表达式的上下文决定赋值的类型:

  然而, 这些无符号变量并不创建容器. 那意味着上面的degrees和θ实际上直接代表Nums. 为了说明, 我们定义一个无符号变量后再赋值:

  Twigils影响变量的作用域。请记住 twigils 对基本的魔符插值没有影响,那就是,如果$a内插,$^a,$*a,$=a,$?a,$.a, 等等也会内插. 它仅仅取决于$.

  第一次调用&say-all时, 就像你期望的一样, 它打印 1, 10, 100。可是第二次它打印 1, 11, 101。 这是因为$lexical不是在调用者的作用域内被查找, 而是在&say-all被定义的作用域里被查找的。这两个动态作用域变量在调用者的作用域内被查找, 所以值为11和101。第三次调用&say-all后,$*dynamic1不再是 11 了. 但是$*dynamic2仍然是 101。这源于我们在块中声明了一个新的动态变量$*dynamic1的事实并且没有像我们对待$*dynamic2那样把值赋值给旧的变量。

  动态变量与其他变量类型在引用一个未声明的动态变量上不同的是前者不是一个编译时错误,而是运行时failure,这样一个动态变量可以在未定义时使用只要在把它用作任何其它东西的时候检查它是否定义过:

  属性是变量, 存在于每个类的实例中. 通过!符号它们可以从类的里面直接被访问到:

  注意属性是怎样被声明为$.x和$.y的, 但是仍然能够通过$!x和$!y访问到属性. 这是因为 在 Perl 6 中, 所有的属性都是私有的, 并且在类中能使用$!attribute-name直接访问这些属性. Perl 6 能自动为你生成访问方法. 关于对象、类和它们的属性和方法的详情, 请查看面向对象.

  编译时常量, 可通过?twigil 访问. 编译器对它们很熟悉, 并且编译后不能被修改. 常用的一个例子如下:

  对self(自身)调用了方法x和方法y, 这是自动为你生成的, 因为在你声明你的属性的时候, 你使用的是.twigil 。 注意, 子类可能会覆盖那些方法. 如果你不想这个发生, 请使用$!x和$!y代替。

  ^twigil 为 block 块 或 子例程 声明了一个形式位置参数. 形如$^variable的变量是一种占位变量. 它们可用在裸代码块中来声明代码块的形式参数. 看下面代码中的块:

  有两个形式参数,就是$first和$second. 注意, 尽管$^second在代码中出现的比$^first早,$^first依然是代码块中的第一个形式参数. 这是因为占位符变量是以 Unicode 顺序排序的.

  子例程也能使用占位符变量, 但是只有在子例程没有显式的参数列表时才行. 这对普通的块也适用

  占位符变量语法上不能有类型限制. 也注意, 也不能使用单个大写字母的占位符变量, 如$^A

  :twigil 为块或子例程声明了一个形式命名参数。使用这种形式声明的变量也是占位符变量的一种类型。因此适用于使用^twigil 声明的变量的东西在这儿也适用(除了它们不是位置的以外, 因此没有使用 Unicode 顺序排序)。所以这个:

  您可以通过$=pod访问 Pod 树,它包含所有作为分级数据结构的Pod结构。

  使用my声明一个变量给变量一个词法作用域. 这意味着变量只在当前块中存在.例如:

  它抛出异常,因为只要我们在同一个作用域内$foo才被定义. 此外, 词法作用域意味着变量能在新的作用域内被临时地重新定义:

  声明符my和our接收一组扩在圆括号中的变量作为参数来一次性声明多个变量。

  这可以和解构赋值结合使用。任何对这样一个列表的赋值会取得左侧列表中提供的元素数量并且从右侧列表中把对应的值赋值给它们。没有得到赋值的元素会根据变量的类型得到一个未定义值。

  要把列表解构到一个单个的值中, 通过使用($var,)创建一个带有一个值的列表字面值。当使用了一个变量声明符时只在单个变量周围提供一个圆括号就足够了。

  anon声明符阻止符号本安装在词法作用域内, 还有方法表中, 和其它任何地方.

  例如, 你可以使用anon声明一个知道自己名字的子例程, 但是仍然不会被安装到作用域内:

  state声明词法作用域变量, 就像 my 那样。然而,初始化只发生一次, 就在正常执行流中第一次遇见初始化的时候。因此, state 变量会在闭合块或 程序的多次执行之间保留它们的值。

  注意,这不是一个线程安全的解构, 当同一个 block 的同一个克隆运行在多个线程中时。要知道方法只有每个类一个克隆,而不是每个对象。

  至于my,声明多个状态变量必须放置在圆括号中, 而声明一个单一变量,圆括号可以省略。

  请注意,许多操作符都伴随着隐式绑定,什么会导致超距作用。使用.clone或强迫创建一个可以绑定的新容器。

  和显式地声明命名状态变量一样,$能够用作不带显式状态声明的匿名状态变量。

  更进一步, 状态变量不需要存在于子例程中。你可以, 举个例子, 在单行程序中使用$在文件中编号行号。

  如果在作用域内你需要多次引用$的值, 那么它应该被拷贝到一个新的变量中。

  这里的@是用圆括号括起来了以和名为@.push的类成员变量消除歧义。索引访问并不需要这种歧义,但你需要拷贝这个值,以便用它做任何有用的事情。

  关于歧义的同样警告适用。正如你可能期望,索引访问也有可能(使用复制以使之有用)。

  就像其它的匿名状态变量一样, 在给定作用域中每次提及%最终都会引入一个单独的变量。

  因为类通常使用 our 作用域, 因此是全局的, 这意味着修改全局状态, 这是强烈不鼓励的, 对于大部分情况, 有更好的方法.

  像 my 一样, temp 在作用域的末尾恢复旧的变量值. 然而, temp 不创建新的变量.

  跟 temp 类似, 如果 block 没有成功退出则恢复之前的值。成功的退出意味着该 block 返回了一个定义过的值或一个列表。

  否则那个die语句会让那个 block 不成功地退出, 把答案重新设置为 42。

  如果一个标量有类型约束但是没有初始值, 它会使用类型约束的类型对象来初始化.

  没有显式类型约束的标量的类型为 Mu, 但是默认会是 Any 类型的对象.

  带有 @ 符号的变量会被初始化为空的数组; 带有 % 符号的变量会被初始化为空的散列.

  变量的默认值可以使用is default特性设置, 通过把 Nil 赋值给变量来重新应用默认值:

  为了强制所有的变量拥有一个有定义的约束, 使用use variables :D指令。这个指令是词法作用域的并且可以使用use variables :_指令进行切换。

  $_是特殊变量,在没有显式标识的代码块中,它是默认参数。所以诸如for @array { ... }和given $var { ... }之类的结构会将变量绑定给$_.

  $/是匹配变量。它存储着最近一次正则匹配的结果,通常包含Match类型的对象。

  要获取所有的位置属性, 使用$/.list,@$/,@( )中的任意一个都可以:

  如果正则中有命名捕获分组,$/可以有命名属性, 或者正则调用了另一个正则:

  $!是错误变量. 如果tryblock 或语句前缀捕获到异常, 那个异常就会被存储在$!中。如果没有捕获到异常, 那么$!会被设置为 Any 类型对象。

  对于当前的 Rakudo, 这个默认在方法.hyper和.race上采用最大 16 个线程。要更改线程的最大数量, 要么在运行 perl 之前设置环境变量 RAKUDO_MAX_THREADS 的值, 要么在使用 .hyper 或 .race 之前创建一个默认改变了的作用域的拷贝:

  1.0-基础部分 pragma mark:输出常量和变量 你可以用print(_:separator:terminator:)函数来输出当前常量或变量的值:默认情况下,该函数通过添加换行符来结束当前行。如果不想换行,可以传递一个空字符串给 terminator 参数--例如...

  特别说明,为便于查阅,文章转自如果你曾经或多或少地写过JS,那么你很可能对它的语法感到十分熟悉。当然有一些奇怪之处,但是总体来讲这是一种与其他语言有很多相似之处的,相当合理而且直接的语法。...

  如:魅族笔试题 本文就 js 如何实现数组去重整理出5种方法,并附上演示Demo 以及 源码。 1.遍历数组法 最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 ...

  去年开始,做为大型网生艺人经纪公司的中樱桃,全面复制韩国SM训练生模式,旗下五只不同风格的偶像女团以联合公演的形式登上舞台,获得粉丝追捧。从2015年开始,中樱桃不断完善其工业化造星体系,在艺人的招募、甄选、培训、包装、线下演艺和内容输出方面不断升级,新装修了5000平米培...

  以前看过这么句话,让我印象特别深刻! “我们现在的处境,都是每一次的选择所造成的。” ① 外在诱惑! 当我们有时做一个决定,外界的声音,存在的事物,会让我们做出并非本心的抉择,有时很容易导致自己偏离原有的轨道,最后又会后悔! 建议做计划之前,最好...

  在别人看到问题的地方看到机会,在互联网变革中把握趋势和商机! 中小企业网络营销发展简史(1994-2017启示录) 文/陈金凌jinling_chen2013 你好,我是陈金凌,一个互联网人。 中国互联网从1994诞生(接入互联网,加入互联网大家庭)到现在也就是23年,中国...

  感冒了,吃完药对弟弟说:我去睡觉了。他说:那我给你唱“睡吧睡吧”。我无奈地回头看了他一眼。他又问:那个是不是叫摇篮曲?这回,我严肃的对他说:首先,姐姐睡的是床,不是摇篮,其次,你唱的话,不是催眠曲是催命曲啊😱

http://korinkorin.com/zilicheng/110.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有