• 请把不听话的【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。

  • 相关阅读:
    万亿级大数据平台的建设实践
    Java开发中的23种设计模式
    FileZilla更新服务器文件后浏览器没有刷新的一种常见情况
    Docker PHP7官方镜像安装Redies扩展
    Docker PHP7官方镜像安装Redies扩展
    Docker PHP7官方镜像安装Redies扩展
    Docker PHP7官方镜像安装Redies扩展
    iOS9.2.1 App从AppStore上下载闪退问题
    iOS9.2.1 App从AppStore上下载闪退问题
    iOS9.2.1 App从AppStore上下载闪退问题
  • 原文地址:https://www.cnblogs.com/piapia/p/5223064.html
Copyright © 2020-2023  润新知