Perl6 -1.3 子例程2
2015-12-23 20:37
330 查看
1、参数的传递
1.1 标量参数
在上一节中,传递的参数非常简单,但也有其缺点。那就是不能改变参数的值。如果只读绑定太受限制了,你可以将i s rw (rw 是read/wr i te 的缩写)特性应用到参数上
以降低这种限制。这个特性说明参数是可读可写的,这允许你从子例程内部修改参数。使用的时候必须小心,回为宫会修改传入的原始对象。如果你试阁传入一个字而值,一个常量,或其官类型的不可变对象到一个有is rw 特性的参数中,绑定会在调用时失败并抛出异常。
用法:
sub test($x is rw){
函数体;
}
例如:
my $x = 2;
say "$x" ; # 2
sub test($x is rw){
$x++;
}
test($x);
say "$x"; #3
如果你想将参数的本地副本用在子例程内部而不改变调用者的变革, 一一使用is copy 特性:
用法:
sub test($x is copy){
函数体;
}
例如:
my $x = 2 ;
say "$x"; #2
sub test($x is copy){
$x++;
say "$x"; #3
}
say "$x"; #2
1.2 数组、散列和函数传递
标量作为参数来传递时,只能以每一个标量作为一个参数,这样,当有多个标量传递时,这种方法就变得比较烦锁。因此,数组,散列的传递方便的解觉这一问题。
1.2.1 数组
用法:
sub test(@数组名){
函数体;
}
例如:
my @T = (1,2,3,4);
test(@T);
sub test(@T){
for @T -> $m {
say "$m";
}
}
output: 1 2 3 4
或
sub test {
my @T = @_;
for @T ->$m{
say "$m";
}
}
output:1 2 3 4
1.2.2 散列
用法:
sub test(%散列名){
函数体;
}
例如:
my %set = {a =>1,
b =>2};
sub test(%set){
my @Key = keys %set;
for @Key ->$k{
say "%set{$k}";
}
}
或
sub test {
my %set = @_;
my @Key = %set;
for @Key -> $k{
say "%set{$k}";
}
}
output: 1 2
1.2.3 函数
用法:
sub test(&函数名){
函数体;
}
例如:
my @T = <Hello word>;
my $n = 2;
test(&play,$n);
sub test(&play, $n){
for 1 .. $n {
play();
}
}
sub play{
say "TEST";
}
output: TEST
TEST
1.2.4 以数组,散列作为占位参数
用法:
sub test(|@TT){
函数体;
}
例如:
my @T = (1,2,3,4);
test(|@T);
sub test(|$m){
say "$m";
}
output:1 2 3 4
my %set = {a => 1,
b=> 2,
c => 3};
test(|%set);
sub test(|$m){
say "$m";
}
output:
a 1 b 2 c 3
1.2.5 ! 符号固定参数个数
用法:
sub test($x,$y,$z!){
函数体;
}
例如:
sub test($a,$b,$c!){
say " $a - $b - $c\n";
}
test("TEST","TEST","TEST"); #Ouput TEST - TEST - TEST
test("TEST","TEST"); # Error
2、Slurpy 参数
有时候,你会希塑让子例程接受任何数量的参数, 并且将所有这些参数收集到一个数组中。为了达到这个目的,给签字添加一个数组参数, 就是在数组前添加一个丰号前缀:
用法:
sub test(*@数组名){
函数体;
}
例如:
my $x = 1;
my $y =2;
my $z =3;
test($x,$y,$z);
sub test(*@T){
for @T -> $m{
say "$m";
}
}
output: 1 2 3
3、返回值
在子函数执行后,可以有返回值,也可以无返回值。用return关键词来返回子函数的值(或列表)
用法:
sub test(参数){
函数体;
return ($x);
}
或
sub test(参数) return Int{ #定义返回类型
函数体;
return ($x);
}
例如:
my %moves = {
hands-over-head => sub {say "/O\";},
bird-arms => sub(say "|/O\|"),
left => sub(say ">O"),
right => sub(say "O<"),
arms-up =>sub(say "\O/")};
my @awesome-dance = <arms-up right left bird-arms hands-over-head>;
for @awesome-dance -> $move {
print %moves{$move}.();
}
print "\n";
1.1 标量参数
在上一节中,传递的参数非常简单,但也有其缺点。那就是不能改变参数的值。如果只读绑定太受限制了,你可以将i s rw (rw 是read/wr i te 的缩写)特性应用到参数上
以降低这种限制。这个特性说明参数是可读可写的,这允许你从子例程内部修改参数。使用的时候必须小心,回为宫会修改传入的原始对象。如果你试阁传入一个字而值,一个常量,或其官类型的不可变对象到一个有is rw 特性的参数中,绑定会在调用时失败并抛出异常。
用法:
sub test($x is rw){
函数体;
}
例如:
my $x = 2;
say "$x" ; # 2
sub test($x is rw){
$x++;
}
test($x);
say "$x"; #3
如果你想将参数的本地副本用在子例程内部而不改变调用者的变革, 一一使用is copy 特性:
用法:
sub test($x is copy){
函数体;
}
例如:
my $x = 2 ;
say "$x"; #2
sub test($x is copy){
$x++;
say "$x"; #3
}
say "$x"; #2
1.2 数组、散列和函数传递
标量作为参数来传递时,只能以每一个标量作为一个参数,这样,当有多个标量传递时,这种方法就变得比较烦锁。因此,数组,散列的传递方便的解觉这一问题。
1.2.1 数组
用法:
sub test(@数组名){
函数体;
}
例如:
my @T = (1,2,3,4);
test(@T);
sub test(@T){
for @T -> $m {
say "$m";
}
}
output: 1 2 3 4
或
sub test {
my @T = @_;
for @T ->$m{
say "$m";
}
}
output:1 2 3 4
1.2.2 散列
用法:
sub test(%散列名){
函数体;
}
例如:
my %set = {a =>1,
b =>2};
sub test(%set){
my @Key = keys %set;
for @Key ->$k{
say "%set{$k}";
}
}
或
sub test {
my %set = @_;
my @Key = %set;
for @Key -> $k{
say "%set{$k}";
}
}
output: 1 2
1.2.3 函数
用法:
sub test(&函数名){
函数体;
}
例如:
my @T = <Hello word>;
my $n = 2;
test(&play,$n);
sub test(&play, $n){
for 1 .. $n {
play();
}
}
sub play{
say "TEST";
}
output: TEST
TEST
1.2.4 以数组,散列作为占位参数
用法:
sub test(|@TT){
函数体;
}
例如:
my @T = (1,2,3,4);
test(|@T);
sub test(|$m){
say "$m";
}
output:1 2 3 4
my %set = {a => 1,
b=> 2,
c => 3};
test(|%set);
sub test(|$m){
say "$m";
}
output:
a 1 b 2 c 3
1.2.5 ! 符号固定参数个数
用法:
sub test($x,$y,$z!){
函数体;
}
例如:
sub test($a,$b,$c!){
say " $a - $b - $c\n";
}
test("TEST","TEST","TEST"); #Ouput TEST - TEST - TEST
test("TEST","TEST"); # Error
2、Slurpy 参数
有时候,你会希塑让子例程接受任何数量的参数, 并且将所有这些参数收集到一个数组中。为了达到这个目的,给签字添加一个数组参数, 就是在数组前添加一个丰号前缀:
用法:
sub test(*@数组名){
函数体;
}
例如:
my $x = 1;
my $y =2;
my $z =3;
test($x,$y,$z);
sub test(*@T){
for @T -> $m{
say "$m";
}
}
output: 1 2 3
3、返回值
在子函数执行后,可以有返回值,也可以无返回值。用return关键词来返回子函数的值(或列表)
用法:
sub test(参数){
函数体;
return ($x);
}
或
sub test(参数) return Int{ #定义返回类型
函数体;
return ($x);
}
例如:
my %moves = {
hands-over-head => sub {say "/O\";},
bird-arms => sub(say "|/O\|"),
left => sub(say ">O"),
right => sub(say "O<"),
arms-up =>sub(say "\O/")};
my @awesome-dance = <arms-up right left bird-arms hands-over-head>;
for @awesome-dance -> $move {
print %moves{$move}.();
}
print "\n";
相关文章推荐
- Perl6 -1.3 子例程1
- Accelerated C++学习笔记5—<组织程序和数据>
- C/C++ 子函数返回局部变量、指针 和改变指针指向
- C语言 子函数返回一个局部指针变量的疑惑
- matlab 子函数
- 音频Audio
- 数据库查询,指定查询结果某列为固定值
- ha_innobase::open
- PAT乙级 统计同成绩学生(20)
- UVA 548 树 ( 从中序和后续回复二叉树)
- imageNamed、imageWithContentsOfFile、imageWithData
- $(function(){})里面不能声明定义函数
- AGPIO 的疑问
- 求圆的面积
- MD5加密的使用 学习笔记
- Oracle中trunc函数、round 函数、ceil函数和floor函数的使用
- chapter8:Linux磁盘与文件系统管理之(1)认识Ext2文件系统
- Android 图片三级缓存之内存缓存(告别软引用(SoftRefrerence)和弱引用(WeakReference))
- 第二章 Spring MVC入门
- Android的学习路线