請把不聽話的【return】關進【class】這個籠子 -开发者知识库

請把不聽話的【return】關進【class】這個籠子 -开发者知识库,第1张


請把不聽話的【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。

 

最佳答案:

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
U19学习网站 » 請把不聽話的【return】關進【class】這個籠子 -开发者知识库