文档章节

GWA2-Perl的面向对象方法中数组或哈希列表参数传递问题

wadelau
 wadelau
发布于 2017/10/01 23:30
字数 773
阅读 33
收藏 0

最近基于 GWA2-Perl 生造了一个机器学习中的线性回归的轮子,纯手工地模拟了一个预测模型的各个模块和步骤。

GWA2的Perl版本继承和实现了GWA2的设计规范和风格,在充分利用Perl的面向对象设计思想及实现时,有些颇为吊诡的地方,应该引起注意,其中方法的参数传值问题就容易引起误解,我们在此前一篇的Blog中曾经谈到按引用传参和按值传参:

GWA2-Perl Warning: Reference found where even-sized list expected, -R/32SJ 。

 

如下是一个具体使用GWA2的Perl版本进行软件编程时,使用Array 或者 Hash进行传值时的正确写法的实例,供后续编程者参考。

正确的做法示例如下。
(A) ctrl/myctrl.pl:
….
my $obj = mod::MyModule->new();
my @arr = (1..5); # array original
my $i = 2;
my $rtn = $obj->getNumberByIndex(\@arr, $i); # pass by reference
….

(B) mod/MyModule.pm:
….
sub getNumberByIndex {
    my $self = $_[0];
    my @arr = @{$_[1]}; # de reference, restore array
    my $i = $_[2];
    ….

}

另外值得注意的是,按应用传递参数,其本身的设计与OOP思想是不相兼容的,在GWA2架构设计中并未充分考虑到,某一变量经由方法传递参数时,其默认行为是参数为局部变量,是按传值进行,也即,所传入的参数在当前方法体内可能产生变化。此时,如果是当着局部的按值传递的,不会影响到方法体外部,而理论上也不应该影响到方法体外部;然而,如果是按引用传递参数,在方法体内修改了引用所指向的参数,则该参数就会发生变化,如果在方法体外的某处有同时引用行为,则系统就可能出现异常、非预期情况。

这一问题,有望在Perl的后续版本中得到解决。目前,在OOP的架构设计中,如果不按引用进行参数传递,而是按照数值进行传递,如上面的代码修改为如下:

my $rtn = $obj->getNumberByIndex(@arr, $i); # pass by value

则可能导致,在 mod/MyModule.pm 中收到参数是一个将 @arr 的元素和 $i 混装的 list 列表,从而导致无法确切区分出第一个参数是一个 @arr , 而第二个参数是一个 $i . 后续也可能出现异常、非预期的情况。其他对Perl的OOP封装的框架是否很好解决这个问题,有待继续探索。

 

gwa2-logo-201606.v2.png (300×300)

gwa2-roadmap-201611.jpg (1224×703)

-GWA2 是一套通用网络应用(软件程序)架构系统,基于 -GWA2 可以轻便构建各种网络应用程序, 包括复杂的在线购物商城、 旅游交易平台、社群或者社交网站和新闻资讯网站等, 也包括各种企事业单位网上门户,在线交互及服务作业系统等. 还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部。

 -R/x12SP 

© 著作权归作者所有

共有 人打赏支持
wadelau
粉丝 1
博文 21
码字总数 27726
作品 0
东城
架构师
私信 提问
GWA2Perl研发:try-catch无法退出循环、方法传参引用传值及多数据库链接

在使用 GWA2Perl 开发时遇到一些破费周折才发现的 Bug或改进的功能,分析记录如下,备忘。 GWA2 是一套跨语言的网络应用软件开发框架,目前有PHP、Java和Perl版本可供下载选用,也即 GWA2PH...

wadelau
2018/11/10
0
0
两个半小时的 Perl 之旅

Perl语言是一门高级解释型动态语言,它的许多数据类型是运行时才确定的,并且经常和PHP和 Python相提并论。Perl从古老的Shell脚本语言中借鉴了许多语法特性,因为被过度使用的各种奇怪符号而...

沙枣
2013/03/14
13.3K
37
perl学习【转载+积累】

基本信息 Perl一般被称为“实用报表提取语言”(Practical Extraction and Report Language)。Perl 最初的设计者为拉里·沃尔(Larry Wall),他于1987年12月18日发表。Perl借取了C、sed、a...

carmen-ly
2016/08/11
9
0
-Java forEach中 Lambda Expr中的 final变量要求

本文是关于 -Java Lambda Expression在forEach方法的应用讨论。对比其他编程语言的foreach 操作(文末附带7种主要编程语言的Loop HashMap by forEach的程序片段),Java 8引入的运用 Lambda E...

wadelau
2018/07/19
0
0
PHP Perl 关联数组 哈希表 Hash Table

关联数组,又称为哈希表(hash table),是一种非常好用的数据结构。 在程序中,我们可能会遇到需要消重的问题,举一个最简单的模型: 有一份用户名列表,存储了 10000 个用户名,没有重复项...

月洛
2013/08/30
0
1

没有更多内容

加载失败,请刷新页面

加载更多

今天的学习

1、执行git add *命令就把改动提交到了暂存区,执行git pull命令将远程仓库的数据拉到当前分支并合并,执行git checkout [branch-name]切换分支 2、执行git commit -m '说明' 命令就把改动提...

墨冥
昨天
0
0
Android4.4 及以下TextView,Button等控件使用矢量图报错

1 问题描述 最近项目开发中,图标资源我尽量使用了矢量图,然而配置了基本的兼容设置,程序在低版本中运行还是出现了问题。 xml布局文件中,在TextView中使用矢量图,比如android:drawableS...

newtrek
昨天
2
0
Chrome DevTools

1.Chrome DevTools Protocol 2.Chrome开发者工具中文文档 3.Chrome DevTools Protocol 4.前端测试 chrome devtools protocol——Web 性能自动化实践介绍 5.基于Chrome devTools远程调试技术方...

IT追寻者
昨天
1
0
640. Solve the Equation

难度不大,主要部分是 实现常数部分与x系数的分解。 分解后分类讨论返回结果即可 class Solution { int parseInt(String s) { if(s.endsWith("x")){ if(s.length()...

reter
昨天
1
0
Docker笔记1——5W简述docker基本概念

Who? docker适合谁?运维,和devops的开发。 Docker 开发方向: 语言:Golang 相关的技术:Swarm、Compose、Machine、mesos、k8s.....--- CI/CD Jeckins整合 WHY? 为什么要用docker?解决了...

HappyBKs
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部