作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望能够在Perl6中运行带有可变数量参数的函数,但是在通读https://docs.perl6.org/language/functions#Arguments之后,我看不到如何完成此操作。我看到许多其他语言的链接,并警告说“标题频繁的问题经常被否决”,但我在文档或StackOverflow的任何地方都看不到它。
我想做这样的事情:
some-test($v1, $v2)
some-test($v3)
multi
的单独功能
最佳答案
TL; DR您正在询问可变参数函数。1简单使用很简单。 P6的某些功能(最引人注目的是位置和命名参数)以及可变参数解构会增加一些皱纹。另外,请参阅其他答案,它们也非常有帮助。
可变数量的参数
简单使用简单的可变参数函数:
sub variadic (|args) { say args .elems }
variadic(); # 0
variadic('1'); # 1
variadic('1', '2'); # 2
|foo
参数将所有剩余参数混入绑定到无sigil标识符
Capture
的
foo
中:
sub variadic ($a, @b, %c, |others) { say others[0] }
variadic 1, [2,3], (:foo), 4, [5,6], (:bar); # 4
others
参数从
4
开头的最后三个自变量中“吸取” 1。
variadic(1, 2); # 2 -- works but args are Ints
variadic(:foo,:bar); # 0 -- where did :foo, :bar go?
variadic((:foo)); # 1 -- works; arg is Pair (:foo)
variadic((1, 2)); # 1 -- works; arg is List (1,2)
**@foo
和
*%foo
+@foo
和
*@foo
where
子句将任何想要的约束强加给限制的参数。 (如果需要,您可以依次将其打包为
subset
。)
Str
类型:
sub variadic (|args where .all ~~ Str) { say args .elems }
variadic(); # 0
variadic('1'); # 1
variadic('1', '2'); # 2
variadic(1); # Constraint type check failed
**@foo
和
*%foo
|foo
始终会捕获所有剩余的参数,包括位置参数和命名参数:
sub slurps-into-WHAT (|args) { say WHAT args }
slurps-into-WHAT(); # (Capture)
Capture
将位置参数存储在可通过位置下标(即
args[...]
)访问的内部列表中,并将命名参数存储在可通过关联下标(即
args<...>
或
args{...}
)访问的哈希中:
sub variadic (|args) { say " {args[1]} {args<named2>}" }
variadic('pos0', 'pos1', named1 => 42, named2 => 99); # pos1 99
*%foo
形式的参数(一个星号前缀和一个哈希arg):
sub variadic-for-nameds (*%nameds) { say %nameds }
variadic-for-nameds(:foo, :bar); # {bar => True, foo => True}
**@foo
形式的参数(两个星号前缀,后跟一个数组arg):
sub variadic-for-positionals (**@positionals) { say @positionals }
variadic-for-positionals(1, 2, 3); # [1 2 3]
+@foo
和
*@foo
+@foo
。除了在某些情况下,这与
**@foo
完全相同。如果可变参数仅获得一个参数,并且该参数是列表或数组,则该参数将绑定到该列表或数组的内容,从而删除列表/数组容器:
sub variadic-plus (+@positionals) { say @positionals }
variadic-plus(1,2,3); # says same as for **@positionals
variadic-plus(1); # says same as for **@positionals
variadic-plus([1]); # [1] -- instead of [[1]]
variadic-plus((1,2,3)); # [1 2 3] -- instead of [(1 2 3)]
+@foo
表单以支持
"single arg rule"。由核心开发人员编写内置插件使用。用户可能希望在想要相同的行为时使用它。
*@foo
。它与
+@foo
的作用相同,它从列表或数组容器args中提取内容并将其扔掉。但这要更具侵略性:
(...)
而不是
[...]
),则它会下降到该列表中,并且如果列表的元素本身是另一个内部列表或数组,则递归地重复该练习。
sub variadic-star (*@positionals) { say @positionals }
variadic-star((1,2),[3,4]); # [1 2 3 4]
variadic-star((1,2),(3,4,(5,6,(7,8)))); # [1 2 3 4 5 6 7 8]
variadic-star((1,2),(3,4,[5,6,(7,8)])); # [1 2 3 4 5 6 (7 8)]
[5,6,(7,8)]
数组中删除容器,但没有降级到其中的。)
foo(...)
与
foo (...)
sub foo (|args) { say args[0] }
foo 'a', 'b'; # a
foo('a', 'b'); # a
sub foo (|args)
一样,没有任何区别。)
foo
和左括号之间插入空格,则您将写出不同的内容:
foo ('a', 'b'); # (a b)
foo
,一个列表
('a', 'b')
与
foo('a', 'b')
对比,后者用两个参数调用
foo
,括号内是两个值。
foo
,这两个都是列表:
foo ('a', 'b', 'c'), ('d', 'e', 'f'); # (a b c)
foo( ('a', 'b', 'c'), ('d', 'e', 'f') ) ; # (a b c)
foo (('a', 'b', 'c'), ('d', 'e', 'f')) ; # ((a b c) (d e f))
foo( (('a', 'b', 'c'), ('d', 'e', 'f')) ) ; # ((a b c) (d e f))
foo
调用得到一个参数,一个列表
( ('a', 'b', 'c'), ('d', 'e', 'f') )
(恰好包含两个内部列表)。
%_
的隐式可变参数命名参数:
say .signature given my method foo {} # (Mu: *%_)
+%foo
和
**%foo
的形式编写参数。杂乱无章的名字进行销毁确实没有任何意义。也许这解释了为什么这两种形式都做疯狂的事情:
**%foo
似乎与
%foo
没有区别。
+%foo
代替
**@foo
之外,
%foo
与
@foo
似乎没有区别。绑定到
%foo
的对象是
Array
!
关于raku - Perl6:函数/子例程的变元数目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54712440/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!