请把不听话的【return】关进【class】这个笼子
请把不听话的【return】关进【class】这个笼子
问:powershell 最垃圾的语句是什么?
答:(函数中的)return
#例子1:函数中的return有时会返回所有内容,而不是你想要的内容,如:
function aaa
{
return 'bbb'
} function ccc
{
aaa
return 'ddd'
} ccc #ccc函数不光返回了我们想要的值ddd,还把aaa函数的返回值bbb返回了。
-----------------我们心目中return的作用--------------------
我们用return想实现2个功能:
1 只返回1---n 个,我们想要的结果。
2 结束当前函数。-----这个功能可以用空的return来实现。
总之,不建议在函数中,用return后面加变量返回内容。
---------------解决方案1---------------
函数中有return,函数中又用了.net方法的情况。请在.net方法前加[void],这样就不会带出多余数据。
powershell 传教士 原创文章 2014-07-18 2014-10-10 2015-03-22 2016-02-27更新,允许转载,但必须保留名字和出处,否则追究法律责任
---------------解决方案2 貌似不灵---------------
使用
return ,$我想要的返回值
或
return @(,$我想要的返回值)
---------------解决方案3 在函数外面,用 -is [array]判断返回值是单一,还是多个。推荐 ---------------
#例子2:
if ($函数名 -is [array])
{
$我想要的返回值 = $函数名[-1]
}
else
{
$我想要的返回值 = $函数名
}
---解决方案3变种,既然返回值或许是数组,那么就可以取第一个,或最后一个值---
#例子3:有个缺点,必须明确知道返回值个数才行。
function 函数a
{
$a = 1
$b = 2
$c = 3
return $a,$b,$c
}
$d,$e,$f = 函数a #函数返回的值,我全要 $g,$null,$null = 函数a #我只想要函数返回的第一个值
$null,$null,$h = 函数a #我只想要函数返回的最后一个值
write-host $d,$e,$f,$g,$h
---------------解决方案4 diy,直接写入外部变量---------------
不用return,而用自定义的return2函数,和自定义变量$global:return2保存要返回的内容。
#例子4:直写外部变量
function return2($youwant)
{
$global:return2 = $youwant
} function aaa
{
return 'aaa'
} function bbb
{
aaa
return2 'bbb' #把返回值写入,或者直接写变量$global:return2 = 'bbb'
return
write-host "运行不到这里"
} write-host $global:return2 #输出
$ccc = $global:return2 #读取
--------------------------------------------
推荐
#例子5:直写外部变量变种,用ref给函数传入【输出外部变量名】的内存地址。
function 函数_把输入的值加一($输入变量名,[ref]$输出变量名2)
{
$输出变量名2.Value = $输入变量名 + 1
} $输出变量名的内存地址 = $null #这行必须有
函数_把输入的值加一 8 ([ref]$输出变量名的内存地址)
$输出变量名的内存地址 #这里输出 9
--------------------------------------------
结论: (函数中的return有坏的特性)
凡是函数中,又调用其他函数,其他函数也有返回值;
凡是函数中有$aaa这样,把值打印到屏幕的;
凡是函数中有write-output $aaa打印屏幕的;
用了return 都会有问题。
---------------解决方案5 把不听话的【return】关进这个【class】笼子 推荐 ---------------
ps 5.0 类的关键字:
hidden 不想被别人用的隐藏属性
static 静态关键字
$this 本类的对象
powershell5.0 中的 class 类的研究:
1 类中不能 function xxx {}这样定义函数 。只能定义方法。
2 类中不能调用ps命令,不能调用ps函数。只能定义方法,并在方法中用命令,然后用return 返回数据。
3 类中可以用$a=5,但不能用$a=5;$a。
4 类中可以用$a=[aaa]::bbb(),但不能用[aaa]::bbb() 。
5 函数中可以定义类。
6 类名,类的属性名,类的方法名,都可以是中文。
7 类如果不用new新建,就不能调用其中的方法,除非方法带有 static (静态方法)前缀。类如果不用new新建,就不能使用其中的属性,除属性带有 static (静态变量)前缀。
类引发的好处:
由上述2可知,你不能在类的方法中用write-host,write-output等命令,【直接!】输出数据。
由上述3,4可知,类的方法不会【直接输出值!】,即不会返回【不想要的多余】数据。
类中没有函数中return的坏特性。
#例子6:把return关入class,编写不会返回多余数据的脚本。例子6,实际上是 例子1 的class化改写。
function aaa
{
return 'bbb'
} class ccc
{
static [string]ddd()
{
aaa
return 'ddd'
}
} [ccc]::ddd()
结论:
不想要多余的数据?用class改写你的function。
请把不听话的【return】关进【class】这个笼子的更多相关文章
- 请求量限制方法-使用本地Cache记录当前请求量[坑]
有个需求:需要限制每个账户请求服务器的次数(该次数可以配置在DB,xml文件或其他).单位:X次/分钟.若1分钟内次数<=X 则允许访问,1分钟内次数>X则不再允许访问. 这类需求很常 ...
- jQuery return false
在jQuery代码中,我们常见用return false来阻止浏览器的默认行为.例如点击链接,浏览器默认打开一个新窗口/标签,为了阻止浏览器的默认行为,我们往往这样操作: $("a.togg ...
- Javascript之return
做表单验证的时候,除了错误提示之外,还要做的一点就是避免表单提交. 如果避免表单提交呢? 有一个方法很简单,就是return 我们来看一下代码: $(".make_sure").c ...
- 请帮我看看这个页面,红色部份如何改才能保存到ACCess数据库中
<% if session("shiwei_username")="" then %> <script language="java ...
- C# return、continue、break
return 终止当前进程 可用循环判断,验证,等功能 if (ew == v) { PublicControlLib.Class.PublicProperties.ShowSuccess(); re ...
- 在jquery的ajax方法中的success中使用return要注意的问题
jquery的ajax方法:在success中使用return:来结束程序的时候,结束的只是success这个方法,也就是说success中的return的作用范围只是success: 如果要想在su ...
- Java中有多少种设计模式?请简单画一下三种常见设计模式的类图?
转载:http://blog.csdn.net/longyulu/article/details/9159589 一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽 ...
- python函数版ATM
最近系统的学习python函数知识点,感觉在面向对象之前,函数的功能确实强大. 最近使用函数写了ATM项目,虽然需求简单但也有很多知识点需要注意,这个项目把python基础的很多知识点都用上了. 前前 ...
- React使用antd Table生成层级多选组件
一.需求 用户对不同的应用需要有不同的权限,用户一般和角色关联在一起,新建角色的时候会选择该角色对应的应用,然后对应用分配权限.于是写了一种实现的方式.首先应用是一个二级树,一级表示的是应用分组,二级 ...
随机推荐
- Frag(匹配跟踪)
‘碎片’(Frag)跟踪是目标跟踪里的一种通过‘部分‘匹配识别的方法,其目标模板是通过图像多个碎片和块来描述.块是任意的,不基于目标模型的(与传统的基于’部分‘的方法不一样,比如人体的四肢与躯干的跟踪 ...
- List,Set,Map用法以及区别(转)
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素.一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java ...
- 通过Trainingkit对Azure有一个初步的了解
学习Azure有一个非常不错的资料库Azure training kit. 这里面包含了很多Azure团队编写的实例代码,以及为初学Azure的开发人员准备的新手教学课程. 开发人员可以从http:/ ...
- Stylish: http://bbs.csdn.net/topics/
[id^=google_ads_], [id^=bd_ad_], #cpro_u2392825, [id^=BAIDU_SSP_], .bbs_top_ad, .csdn-toolbar, #topi ...
- apache svn subversion安装和配置(使用源码安装包方式)
环境:虚拟机下centos7 1.下载安装包:http://subversion.apache.org/download.cgi 2.上传到指定文件夹并解压 3.安装依赖包 apr apr-utils ...
- Linux之保留yum安装软件后的RPM包
yum安装软件很方便,但是下载下来的rpm包在安装后默认会被删除掉: 如果希望保留yum安装的软件包该如何做呢? 设置方法: 将/etc/yum.conf里对应的keepcache参数改为1即可,然后 ...
- python: jquery实现全选 反选 取消
引入这个jquery-1.12.4.js jquery实现全选 反选 取消 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitio ...
- 【转】Struts1.x系列教程(6):Bean标签库
转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/archive/2009/0 ...
- Java 基础知识 问答
1,Java为什么能跨平台运行?请简述原理. 因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码.然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由J ...
- Unity中Collider和刚体Collider性能对比
测试方式: 每个对象做大范围正弦移动,创建1000-5000个对象,保证场景分割树的实时更新,并测试帧率 测试脚本: 移动脚本: using UnityEngine; using System.Col ...