ãã«åäœããã³ãã«æ¡ä»¶ä»ãã¢ã¯ã»ã¹ïŒãã«ãœãŒãã³ã°ïŒã¯ãèšèªãžã®äŸ¿å©ãªè¿œå ã§ãã
_Update _ïŒ @ BrucePayã¯ã ?=
ãŠnullæ¡ä»¶ã®_assignment_ãè¿œå ã§ææ¡ããŸã-以äžã®ã³ã¡ã³ããåç
§ããŠãã ããã
ããšãã°ã次ã®ããã«æžã代ããã«ïŒ
if ($null -ne $varThatMayBeNull) { $varThatMayBeNull } else { $fallbackValue }
#
if ($null -ne $varThatMayBeNull) { $varThatMayBeNull.Name } else { $null }
次ã®ããã«æžãããšãã§ãããããããŸããïŒ
$varThatMayBeNull ?? $fallbackValue # null-coalescing
#
$varThatMayBeNull?.Name # null-conditional access, for Set-StrictMode -Version 2+
$varThatMayBeNull?[42] # ditto, with indexing
nullæ¡ä»¶ä»ãã¢ã¯ã»ã¹ã«ã€ããŠïŒ Set-StrictMode
ããªãïŒããã©ã«ãïŒã®å Žåã $varThatMayBeNull.Name
䜿çšã§ããŸããç¹å¥ãªæ§æã¯å¿
èŠãããŸããã ãã ãã Set-StrictMode -Version 2
以äžãæå¹ãªå Žåã $varThatMayBeNull.Name
ã¯_break_ã«ãªããŸããããã§ãnullæ¡ä»¶æŒç®åïŒ ?.
ïŒã圹ç«ã¡ãæ瀺çãªæå³ãç¡èŠããããšã瀺ããŸããç°¡æœã«$null
ã
æªè§£æ±ºã®è³ªåïŒ
$varThatMayBeNull?[42]
ã¯ãå€æ°ã$null
ã®å ŽåãåŠçããŸãããããã§ãªãå Žåã¯ãæå®ãããã€ã³ããã¯ã¹ãæã€é
åèŠçŽ ãååšããå¿
èŠããããŸãã
ãããã£ãŠã_indexing_ãnullæ¡ä»¶ä»ãã«ããããšã圹ç«ã¡ãŸã-.ElementAtOrDefault()
ã䜿çšããå¿
èŠããããŸãïŒã
2ã€ã®åºæ¬çãªéžæè¢ã¯æ¬¡ã®ãšããã§ãã
ååšããªã_index_ãç¡èŠããæå³ãæ瀺çã«ç€ºãè¿œå ã®æ§æãèãåºããŸãã
?[...]
ãš[...]?
ã¯ãããŸããã®ããã«ãªãã·ã§ã³ã§ã¯ãªãããšãèãããšãåé¡ã¯ããã«ã©ã®æ§æãéžæãããã§ãã[...?]
ã§ãããããã¯åä»ãªããã§ããSet-StrictMode
èšå®ã§ç€ºãããŠããããã«ãååšããªãã€ã³ããã¯ã¹ãžã®ã¢ã¯ã»ã¹ã«é¢ããæ¢åã®åäœã«äŸåããŸãã
é¢é£ïŒäžé æ¡ä»¶ãå®è£ ãã
@ mklement02çªç®ã®ãµã³ãã«ã¯ãïŒããªãã§èšèšäžæ©èœããŠããããã§ãã
ãã¶ãname()
å€æŽããŸããïŒ
@iSazonov ïŒè¯ãç¹ã§ããã Set-StrictMode -Version 2
以äžãæå¹ã§ãªãéãã ?
ãªãã§ã®ã¿æ©èœããŸã-ãããæ確ã«ããããã«æåã®æçš¿ãæŽæ°ããŸããã
ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã¯ãPowerShellãä»ã®èšèªã§å©çšã§ãããã®ã ãšæããŸãã ææ¡ã«+1ããŸãã
ä»ã®èšèªããã®æ¬¡ã®ãµã³ãã«ãæ€èšããŠãã ããã
a="${b:-$c}"
a = b || c;
a = b or c
a := b ? c
a = b ? b : c;
ã§ã
a = b if b else c
ãããè¯ã
if (b) { a = b } else { a = c }
å€ãã®å Žåãããã«è©³çŽ°ã«èª¬æããå¿ èŠããããŸã
a =ïŒifïŒb -ne $ nullïŒ{b} else {c}ïŒ
ãã¹ãŠã®æ±ããæ¥ãããããæããããŸãã
åé¿çãšããŠãä»æ¥ãããè¡ã£ãŠããããšã«æ°ã¥ããŸããã
`` `powershell
$ word =ïŒ$ nullã "two"ã "three"ïŒãWhereïŒ{$ _ -ne $ null}ã "First"ïŒ
ãã
ç§ã¯åæ§ã®ãã¿ãŒã³ã䜿çšããŸãïŒ
$word = ($null, "two", "three" -ne $null)[0]
@kfsoneäŸ$a=(if ($b -ne $null) { $b } else { $c })
å°ããªãšã©ãŒããããŸãã $a=$(if ($b -ne $null) { $b } else { $c })
$( )
ã§ããå¿
èŠããããŸããã $a=$(if ($b -ne $null) { $b } else { $c })
ã®ã¿$( )
ããv2以éã次ã®æäœãå®è¡ã§ããŸãã
$a = if ($b) { $b } else { $c }
@bgshacklett $word=($null,'two')[$null -ne 'three']
ãšããæå³ã§ã¯ãããŸãããïŒ
ããã6.1ãã6.2ããããŠãFutureãã«å€ãã£ãã®ã¯å°ãæ®å¿µã§ãã
@ TheIncorrigible1ããããäžèšã§è¿œå ãããã®ãã³ããŒããŠè²Œãä»ãããšã $word
ã®å€ãã2ãã«èšå®ãããŠããããšãããããŸãã ç§ãæåã«ãã¿ãŒã³ãèŠããã®StackOverflowã®åçã«ã¯ããã詳现ãªæ
å ±ããããŸãã
https://stackoverflow.com/a/17647824/180813
ããŒã¬ã¹ã¯ãªããã¯ã¢ã©ãŠã³ãã¯ãRIPE-DBãŠãŒã¶ãŒãŸãã¯çµç¹ã®ã¬ã³ãŒããç»é²ããã³/ãŸãã¯ç §äŒããã·ãã³ãæžãã20幎åã®ç§ã«ã¢ããŒã«ããŸãããPowerShellã«æåŸ ããŠããã®ã¯ãååã«ãã®èšèªã䜿çšããããã«ä¿ããã®ã§ãããããã«æããæ€ãä»ããã®ã§ã¯ãªãã
ç§ã®ãªããã¹è©Šéšã¯ããã§ãïŒæ°å¹Žã®æã®åå3æã«ã¿ãã¬ããã§ãããèªã¿ãããšæããŸããé»è©±ã®CEOãç§ã«äœçŸäžãã«ã倱ã£ãŠãããšå«ã³ãªãããäºæ¥é ããããŸããã
ïŒäœè«ã§ãããããã¯ç§ãFacebookã§åããç·æ¥ã®è¿ éãªãªãŒã¯ããæ»ã£ãŠã2åã§ãªã©ã³ãã®äººå£ãããå€ãã®äººã ã空ã«ãªã£ããšèšããããŸã§ãå®éã®çµéšã®å€§ãŸããªèªåŒµã«ãããŸããã§ãããã¥ãŒã¹ãã£ãŒããããã¯ç§ã®ã³ãŒãã§ã¯ãªããééãã¯ãéåžžã«ç¹æ®ãªãã³ãã¬ãŒãã®å Žåã®c ++æšæºã§ã®returnxãšreturnïŒxïŒã®ã»ãã³ãã£ã¯ã¹ã®ããããªå€æŽã§ãããããã®ã³ãŒãã2åã§èªã¿ããã§ãããç· ãåããæºè ¹ããããŠãªã©ã³ã人ã®ç«ã®åçãè©ã«ãããŠãããã¹ãŠã®è©°ãŸãã®éåœã¯ãããã»ã©ã¯ãŒã«ã«èãããŸããã§ããïŒ
ããã PSã«ã¯ããã³ãã1åéãã®éèšãå¿ èŠãªå Žåã«æé©ãªå·§åŠãªããªãã¯ãããã€ããããŸãã
ä¿å®å¯èœãªã³ãŒãã®å Žåãçæ³çã«ã¯ãCïŒã®ãããªæ瀺çãªnullåäœæŒç®åãå¿
èŠã§ãã ç§ã«ãšã£ãŠã®äž»ãªåé¡ã¯ããããã«äœã䜿çšããããšããããšã§ãã ?
ã¯ãã§ã«Where-Object
ãšã€ãªã¢ã¹ãããŠããŸãïŒãããæ¶å»ãããã®ã§ãããéåžžã«äžè¬çã«äœ¿çšãããŠããŸãïŒã %
ã¯ForEach-Object
ãšã€ãªã¢ã¹ãããŸãããã¢ãžã¥ã©ã¹æŒç®ã劚ããããšã¯ãªããããçè«çã«ã¯ãå°ãªããšã?
nullåäœæŒç®åã«ããããšãå¯èœã§ãã眰é; Where-Object
ãå®éã«ã¯æå¹ã§ã¯ãªãåŒã§ã¯ããã®ããã«è§£éãããã ãã§ãã
@ vexx32 ïŒ
_expression_ã¢ãŒãã«ã€ããŠè©±ããŠããã®ã§ãå°ãªããšã_syntactically_ ??
ã¯åé¡ãªãã¯ãã§ããã ?
ã¯ãã³ãã³ã[ãšã€ãªã¢ã¹]ãšããŠã_argument_ã¢ãŒãã§ã®ã¿èªèãããŸãã
ã·ã³ãã«ã®åå©çšãæ··ä¹±ãåŒãèµ·ãããã©ããã¯ããããŸããããã·ã³ãã«ãããŸããŸãªã³ã³ããã¹ãã§äºéã®çŸ©åãæããã®ã¯åããŠã§ã¯ãããŸããã
é©ããããšã«ãPowerShellã§ã¯çŸåšå€æ°åã®éé æåãšããŠ?
ãèš±å¯ãããŠãããããnullãœãŒãã³ã°ã«?.
ãš?[]
ã䜿çšããããšã¯ãæè¡çã«ã¯é倧ãªå€æŽã«ãªããŸãã
PS> $foo? = @{ bar = 1 }; $foo?.bar # !! $foo? is a legal variable name
1
ãã ããããããã±ãã3ïŒã°ã¬ãŒãšãªã¢ã®å€æŽã®
誰ãã䜿ã£ãŠããã®ãèŠãããšããªããšã¯èšããŸãããïŒ å€æ°åã§...誀èªãããå¯èœæ§ãããã®ã§ãç§ãããããŸããã ãããããããããŸãããã°ãããã¯å®å šã«äœ¿çšã§ããã¯ãã§ãã
ãããæ瀺ããã®ã¯å°ãé ããšæããŸãããBashã¯ãã©ã¡ãŒã¿ãŒçœ®ææ©èœïŒ https://www.tldp.org/LDP/abs/html/parameter-substitution.html ïŒã§ããïŒããã³ãã®ä»ã®ããã€ãã®ã±ãŒã¹ïŒãåŠçããŸãã
ããã䜿ã£ãŠã§ããããšã®æ°ãéåžžã«å€ããããåŠã¶ã®ã¯ã¯ããããããŸããããããã¯ä¿¡ããããªãã»ã©åŒ·åã§ãã PowerShellãå€æ°ã§äžæ¬åŒ§ã䜿çšããæ¹æ³ã®ããããã®æ£ç¢ºãªè¡šèšã䜿çšããããšã¯äžå¯èœã§ãããèšèªã®äžè¬çãªæèŠã«å¿ ãããé©åãããšã¯éããªãããšãç解ããŠããŸãããããã¯æçšãªããŒã¿ãã€ã³ãã®ããã§ãã
@bgshacklett ïŒ
ã¯ãããã©ã¡ãŒã¿ã®çœ®æã¯åŒ·åã§ãããæ®å¿µãªãããããã¯_learn_ã ãã§ãªãã_remember_ã«ãšã£ãŠãè² æ ã«ãªããŸãã
ãã®ãããBashã®_æ©èœ_ã¯ãã°ãã°èå³æ·±ããã®ã§ããããããã®_æ§æ圢åŒ_ã¯ãã°ãã°é£è§£ã§ãèŠãã«ãããPowerShellã«ã¯é©ããŠããŸããã
_Brace expansion_ïŒäŸãã°ã a{1,2,3}
ã§bash
ã«æ¡å€§a1 a2 a3
ïŒè¡šçŸç§ã¯PowerShellã§èŠãã®ã倧奜ããããããPowerShellã®-é©åãªãšæãèå³æ·±ãæ©èœã®äŸã§ããæ§æ-ïŒ4286ãåç
§
åæããŸãã ãã®åé¡ãæ£ç¢ºãªè§£æ±ºçã§ã¯ãªããä»ã®å Žæã§ã©ã®ããã«è§£æ±ºããããã®äŸãšããŠãç§ã¯ãããåãäžããŸããã
èæ ®ãã¹ããã1ã€ã®æŒç®åããããŸãã
$x ?= 12
èšå®ãããŠããªãïŒååšããªãïŒå Žåã $x
èšå®ãããŸãã ããã¯ãåæåãã¿ãŒã³ãã®äžéšã§ãããåŸæ¥ã®èšèªã§ã¯äžè¬çã§ã¯ãããŸããããã·ã§ã«ãããŒã«ã®äœæãªã©ã®ïŒåçã¹ã³ãŒãã®ïŒèšèªã§ã¯ããŠãŒã¶ãŒãæå®ããŠããªãå Žåã«ããã©ã«ããèšå®ããã¹ã¯ãªããã䜿çšããã®ãäžè¬çã§ãã ã ïŒå®éããã©ã¡ãŒã¿ãŒåæååã¯ããªãæ®åããŠããŸããïŒ
ãããããããã£ã«æ¡åŒµããŸãã
$obj.SomeProperty ?= 13
ãªããžã§ã¯ããååšããªãå Žåã¯ããªããžã§ã¯ãã«ã¡ã¢ããããã£SomeProperty
ãè¿œå ããŠåæåããŸãã
ãããŠ-楜ãã¿ã®ããã«- -or
ã䜿çšããŠå€æ°ãåæåãããã1ã€ã®ããªãšãŒã·ã§ã³ïŒ
$x -or ($x = 3.14) > $null
$x ?= 12
ã¯çŽ æŽãããã¢ã€ãã¢ã®ããã«èãããŸãã
æã
ã¯ããããLHSã¯ãªã_exist_ããããŸãããã_doesãååšããå Žåã¯çºçããå Žåã ãã§ãªããcontain_ããã«ã¯ããããã®æŒç®åã®ãã¹ãŠãé©çšãã¹ãã§ãããšç§ã«èµ·ãã£ã$null
ïŒãš[System.Management.Automation.Internal.AutomationNull]::Value
åãããã«æ±ã$null
ãã®ã³ã³ããã¹ãã§ã¯
ããŒãããããã£SomePropertyãè¿œå ããŠåæåããŸã
ãã®æå³ã§ã $obj.SomeProperty ?= 13
ã¯ã .SomeProperty
ãååšãã $null
ãå«ãŸããŠããå Žåã«ã®ã¿æå³ããããŸããããã¯ãéåžžã®å²ãåœãŠã§ãæé»çã«ããããã£ãäœæã§ããªãããã§ãïŒå¯Ÿç
§çã«ã_hasthables_ã®å Žåæé»çãªãšã³ããªã®äœæã¯çã«ããªã£ãŠããŸãïŒã
説æãããã¹ãŠã®ãªãã¬ãŒã¿ãŒã¯ãLHSãå³å¯ã¢ãŒãã®ååšãã§ãã¯ããå é€ããå¿ èŠããããŸãã
ç§ã¯strictmodeãååšããªãããããã£ã«ã¢ã¯ã»ã¹ããããããªããåæ¢ããçç±ã®èåŸã«ããæå³/æšè«ã«çåãæ±ããŠããŸãã $x.pretnd
ãããªã¿ã€ããã¹ããã£ããããæå³ã¯ãããŸããïŒ assert(x != null)
ãããªä»®å®ããã§ãã¯ããæå³ã¯ãããŸããïŒ ã³ãŒãå
ã§èª€ã£ãŠ$null
ããã«äŒæããã®ããããã¯ããæå³ã¯ãããŸããïŒ
nullãœãŒãã³ã°ïŒïŒãïŒã¯ã$ nullãç°¡æœã«ç¡èŠãããšããæ瀺çãªæå³ã瀺ãã®ã«åœ¹ç«ã¡ãŸãã
ããã¯ã .
ãã§ã«éå³å¯ã¢ãŒãã§ä¿¡å·ãéããã®ã§ã¯ãããŸãããïŒ å³å¯ã«ãããã£ãå Žåã¯ãæåã«.Name
ååšãããã©ããã確èªã§ããŸããæåã«ç¢ºèªããªãããšã§ã確èªã¯éèŠã§ã¯ãªããšããæ瀺çãªæå³ããã§ã«ç€ºããŠããŸãã
StrictModeã«ãååšããªãããããã£ãžã®ã¢ã¯ã»ã¹ãš$null
è¿éãçŠæ¢ãããŠããç®çãããå Žåãåãçç±ã?.
ã«é©çšãããããšã¯ãªããåãçç±ã§åãäŸå€ãã¹ããŒãããŸãã ã ããã§ãªãå Žåã¯ããªãã§ããïŒ
nullåäœã䜿çšãããšã次ã®ããã«èšè¿°ã§ããŸãã
$result = Invoke-RestMethod -Uri 'https://example.org/api/test'
$test = $result?.Name
ã .
ããã«åäœããstrictmodeã䜿çšããŠãã人ã«äŸå€ãã¹ããŒããªããããããã¹ãŠã®ããããã£åç
§ã«åžžã«?.
ã䜿çšããããšãããã«æšå¥šãŸãã¯æ
£çšçã«ãªããŸããïŒ
ããšãã°ãã¹ã¯ãªããã®å
é ã«å®£èš# StrictMode SkipMemberExistenceCheck
ãèšå®ãããã unstrict code
ãããã¯ã瀺ãããã®ãšã¹ã±ãŒããããã³ã°å±æ§ãèšå®ãããã§ããããã«ãå€æ°èšå®ã䜿çšããŠæ§æå¯èœãªstrictmodeãå¿
èŠã§ããäžè¬çã«ïŒ [欲æ±ã¯ç°¡æœãªCïŒã¹ã¿ã€ã«ã®æ§æã ãšæããŸãããç§ãäœãæå³ãããã¯ãåç¥ã§ããã]
èããŠãããŠããããšãã@ HumanEquivalentUnitã
$x.pretnd
ãããªã¿ã€ããã¹ããã£ããããæå³ã¯ãããŸããïŒ
èšèšæå³ã«ã€ããŠè©±ãããšã¯ã§ããŸããããããã¯ç§ã«ãšã£ãŠçã«ããªã£ãŠããŸã- Set-StrictMode -Version 1
ã_variables_ïŒã®ã¿ïŒã«å¯ŸããŠè¡ãããšãšé¡äŒŒããŠããŸãã
å€æ°ã®å Žåãããã¯å€ãããŸããŸ$null
ã§ãããã©ããã§ã¯ãªãããããã®_existence_ã«é¢ãããã®ã§ãããããããã£ã®ååšã®ãã§ãã¯ã¯åããã¿ãŒã³ã«åŸããŸãã
éçã«åä»ããããã³ã³ãã€ã«èšèªã_ã³ã³ãã€ã«æã«_å ±åãããšã©ãŒãèŠã€ããã®ã«æãè¿ãåçã¹ã¯ãªããèšèªã ãšæããŸãã
ããã¯äœã§ã¯ãããŸããã ä¿¡å·ã¯ãã§ã«éå³å¯ã¢ãŒãã«ãªã£ãŠããŸããïŒ å³å¯ã«ãããã£ãå Žåã¯ãæåã«.Nameãååšãããã©ããã確èªã§ããŸãã
ã¯ãããã ããéå³å¯ã¢ãŒãã§ã¯ãåè¿°ã®ååšãã§ãã¯ãçç¥ããŸããæåã§ã®ãã¹ãã¯æããã«éåžžã«é¢åã§ãããçµã¿èŸŒã¿æ©èœãããåžžã«äœéã§ãã
æåã«ãã§ãã¯ããªãããšã§ããã§ãã¯ã¯éèŠã§ã¯ãªããšããæ確ãªæå³ããã§ã«ç€ºããŠããŸãã
éèŠãªã®ã¯ã Set-StrictMode -Version 2
以äžã®å Žåã次ã®ããã«ãªããšããããšã§ãã
.?
ã¹ã¯ãªããã®å é ã«å®£èš
# StrictMode SkipMemberExistenceCheck
ãèšå®ããããunstrict code
ãããã¯ãäžè¬çã«ç€ºãããã®ãšã¹ã±ãŒããããå±æ§ãèšå®ã§ããŸãã
é¢é£ïŒ Set-StrictMode
ã®çŸåšã®åçã¹ã³ãŒãã«ã¯åé¡ããããŸãã _lexical_ strictã¢ãŒããå®è£
ããããã®@lzybkrã®RFCãã©ãããåç
§ããŠãã ããã https://github.com/PowerShell/PowerShell-RFC/blob/master/1-Draft/RFC0003-Lexical-Strict-Mode.md
ããã©ã«ãã§ã¡ã³ããŒã®ååšãã§ãã¯ã®å©ç¹
PSã«ã¯ãã¡ã³ããŒãã§ãã¯ãå®è¡ããã³ãŒããå«ãŸããŠãããã¡ã³ããŒãååšããªãå Žåã¯$ nullãè¿ããŸãã ããã¯ããã©ã«ãã®å©ç¹ã§ãããå¿
èŠã«å¿ããŠ$x.psobject.properties...
ãŠç¬èªã®ã¡ã³ããŒååšãã¹ããäœæããããšã§ãåé¿ã§ããŸãã StrictModeã¯ãã®å©ç¹ãåãé€ããååšãã¹ããäœæããªããã°ãªããªããšãã?.
ã¯ã .
åžžã«å®è¡ããããšãååŸããããã®ç°¡æœãªåé¿çãæäŸããŸãã ãŸããã¡ã³ããŒãååšããããšãéèŠãªå Žåã§ãããããåå¥ã«ã³ãŒãã£ã³ã°ããå¿
èŠããããŸãã
ããããããã¯ç§ã«ã¡ãœããåŒã³åºãã«ã€ããŠäœãå°ããããŸãïŒ
$x.pretend -> $null
$x.pretend() -> Exception MethodNotFound
$x?.pretend -> $null
$x?.pretend() -> ____ what goes here? $null?
set-strictmode -version 2
$x.pretend -> Exception PropertyNotFoundStrict
$x.pretend() -> Exception MethodNotFound
$x?.pretend -> $null
$x?.pretend() -> ____ ?
ã€ãŸãã ?.
ã¯ãéstrictmodeã§ã®ããããã£ã«ãã¯ã¢ããã®.
ãšåãããã«åäœããŸãããnon-strictmodeã§ã®ã¡ãœããåŒã³åºãã®.
ãšã¯åââäœãç°ãªãã埮åŠãªéãããããŸããããããã€ã³ã®äº€æã ã€ãŸãã ?.
ã䜿çšãããšãã¡ãœãããåŒã³åºããããã©ããããŸãã¯äœãèµ·ãããªãã£ããã©ãããå€æããæ¹æ³ããŸã£ãããªããšããããšã§ããïŒ ããããã£ã¯getterã¡ãœããã§ãµããŒãã§ããŸãããDotNetã§ã¯ãgetterãå
éšç¶æ
ãå€æŽããªãã®ãæ
£äŸã§ãããšæããŸãããã¡ãœããåŒã³åºããç¶æ
ãå€æŽããã®ã¯éåžžã®ããšã§ãã ?.
ã䜿çšãããšããªããžã§ã¯ãã®ç¶æ
ãå€æŽãããã©ããããããŸãããïŒ
??
ãå·ŠåŽã®åŒããçŽæ¥PropertyNotFoundExceptionãšMethodNotFound ExceptionsãåŠçã§ããããã«ãïŒãã ããã¡ãœããå
ã§çºçããä»ã®Exceptionsã¯åŠçã§ããªãïŒã$ãåŠçããããšã§ãç®çã®ã¡ãªãããåŸãããšãã§ãããã©ããçåã«æããŸãã nullã§ããã ?.
ã¯ãŸã£ãããããŸããã äŸãã°
$varThatMayBeNull ?? $fallbackValue # null-coalescing
#
$varThatMayBeNull.Name ?? $fallbackvalue # catching PropertyNotFoundStrict exception
$varThatMayBeNull.Name ?? # default fallback is $null
$varThatMayBeNull.Method() ?? # catching MethodNotFound Exception
# and potentially addressing the index case too
$varThatMayBeNull.first.second[3].Method() ?? # catching MethodNotFound Exception, or index not found Exception
ãããŠã ?.
ãã¡ã³ããŒãåŒã³åºããããããããã£ã«ã¢ã¯ã»ã¹ããããã代ããã«ãã¡ã³ããŒãååšãããã©ãããå°ããç°¡æœãªæ¹æ³ã§ããã[bool]ãè¿ããŸãã
??
ãš?.
ã®åãæ§æã®è¿œå ã«ãããããå€ãã®ç¶æ³ããæ··ä¹±ã®å°ãªãéè€ã§åŠçã§ããŸãã
StrictModeã¯ãã®å©ç¹ãåãé€ããååšãã¹ããäœæããå¿ èŠããããšããé害ãæ®ããŸã
ãã人ã®é害ã¯å¥ã®äººã®å©çã§ãïŒ
ããã¯ãã¹ãŠã_ããã©ã«ãã§_äœãããããã«ãã£ãŠç°ãªããŸãã
ã³ãŒãã«_typos_ããªããšç¢ºä¿¡ããŠããå Žåã¯ãå¿
ã_default_ã®åäœïŒå³å¯ã¢ãŒãOFFïŒãå©çšããŠãã ããã .?
ïŒ_ property_ã¢ã¯ã»ã¹ã®å Žå-ãåç
§ïŒã¯å¿
èŠãããŸããã次ã®ã³ã¡ã³ãã¯_methodcalls_ãš_indexing_ïŒã§ãã
Set-StrictMode -Version 1
ã䜿çšããåŸåããããŸãããäž»ã«ïŒ2798ïŒããã¯ç¬ç«ãããã°ã§ãïŒãåå ã§ã -Version 2
以äžãç
©ããããšæããŠããŸãããã®ææ¡ïŒãïŒaïŒããããã£åã®ã€ã¥ããééããŠããªãããšãããã³/ãŸãã¯ïŒbïŒã³ãŒããæå³ãã以å€ã®ããŒã¿åã§èª€ã£ãŠæäœãããŠããªãããšã確èªãããå Žåã¯ãstrictã¢ãŒããããŒãžã§ã³2以éã«èšå®ããŠãã ããã
ã¡ã³ããŒã®ååšãæ瀺çã«ãã¹ãããããšã¯ãå®éã«ã¯å¥ã®ãŠãŒã¹ã±ãŒã¹ã§ãããæå¹ãªå³å¯ã¢ãŒãã«é¢ä¿ãªãå¿ èŠã«ãªãå¯èœæ§ããããŸãã
OPãã«ããŒããŠããªã_ã¡ãœããåŒã³åºã_ã«ã€ããŠïŒ
_ã¡ãœããåŒã³åºã_ïŒäŸïŒ $varThatMayBeNull.Method()
ïŒãš_indexing_ïŒäŸïŒ $varThatMayBeNull[$index]
ïŒã¯ãå³å¯ã¢ãŒãããªããŸãã¯ããŒãžã§ã³1ã§ãã£ãŠããäž¡æ¹ã®ã±ãŒã¹ãçŸåš_åžžã«_ãšã©ãŒãåŒãèµ·ããå Žåã«ã¡ãªããããã2ã€ã®ã±ãŒã¹ã§ããã¢ã¯ã»ã¹ãããŠããå€ã¯$null
ã§ãã
æ§æã¯ãã¡ãœããã®ããããã£ã®å ŽåïŒ $varThatMayBeNull?.Method()
ïŒãšåãã§ãããã€ã³ããã¯ã¹äœæã®å ŽåïŒ $varThatMayBeNull?[$index]
ã¯CïŒã®å Žåãšåæ§ã§ãã
_Update_ïŒã€ã³ããã¯ã¹ä»ãã«ã¯2çªç®ã®åŽé¢ããããŸããã€ãŸããå€æ°ãnull以å€ã§ããããæå®ãããã€ã³ããã¯ã¹ã®èŠçŽ ãååšããªãå ŽåïŒããšãã°ã $arr = 0,1; $arr[2]
ïŒã ã¹ããªã¯ãã¢ãŒãããŒãžã§ã³2以äžã§ã¯ãããã¯$null
ãšè©äŸ¡ãããŸãããããŒãžã§ã³3以éã§ã¯ãšã©ãŒãçºçããããããã®ãšã©ãŒããªããã¢ãŠãã§ãããšäŸ¿å©ã§ãã ãã ãããã®å Žåã®æ§æã«ã¯èª²é¡ããããŸããçŸåšãããããåä»ãª[...?]
ææ¡ããŠããæŽæ°ãããOPãåç
§ããŠãã ããã
ãããŠãã¯ããç§ã¯ãã®ãããªã¢ã¯ã»ã¹ãããã©ã«ãã§$null
ããŸã-ã¡ãœããã®å Žåã§ã-ç¹°ãè¿ããŸãããã¢ã¯ã»ã¹ãããŠãããªããžã§ã¯ãã$null
ãŸãã¯ãã®ãããªé
åèŠçŽ ãååšããªãå Žåã
CïŒã«ã¯ã第2ã®æå³ã§nullæ¡ä»¶ä»ãã€ã³ããã¯ã¹ããªãããšã«æ³šæããŠãã ããã
ææ¡ããŠããæ¹æ³ãšã¯ãŸã£ããç°ãªããnullæ¡ä»¶ä»ãã®ã€ã³ããã¯ã¹ãäœæãããŸãã CïŒã¯ïŒå°ãªããšã...ïŒ array?[0]
ãèš±å¯ããŸããããã¯ãéåžžã®ãã€ã³ããã¯ã¹ãnullé
å/ã³ã¬ã¯ã·ã§ã³ã«å
¥ãããåé¡ããã€ãã¹ããŠnullãè¿ãã ãã§ãã
ãããããããç§ã¯ãããè¯ãèãã§ããããšã«åæããŸãã ããã«ãããäŸå€åŠçãè¡ãæéãçããã³ãŒããéåžžã«æ確ã§ç°¡æœã«ãªããŸãã
@ vexx32 ãã€ãŸãnullæ¡ä»¶ä»ãã€ã³ããã¯ã¹ã®_one_ã¢ã¹ãã¯ãïŒ array
array?[0]
ãnull
å Žåãã€ã³ããã¯ã¹æäœã¯ç¡èŠãããŸã-ããªããè¿°ã¹ãŠããããã«ãCïŒã«ãããããããŸãã
ç§ããã£ãïŒã¢ããããŒãïŒ_also_ïŒãã«æ¡ä»¶ã€ã³ããã·ã³ã°ã®_other_æ
æ§ã®è©±ïŒå Žåarray
ã§array?[0]
_not_ããnull
ããã¯ã€ã³ããã¯ã¹ã§_TheèŠçŽ ã§ãããŸã0
_ååšããŸããã
ç§ã®ç¥ãéããCïŒã§ç¡èŠã§ããªãã®ã¯åŸè ã§ãããããã§ã圹ç«ã€ãšæããŸãã
ãããã®2ã€ã®åŽé¢ã«ç°ãªãååãä»ããããã®çšèªãèããããšãã§ããŸããïŒ
å¥ã®JavaScriptã®åé¡ã®ã³ãŒãã¯ã $_.Description[0].Text
ãã$_?.Description[0?]?.Text
ã«ãªããŸãããããã¯ãããã§ã¯ãªããšæããŸãã ãããŠã ??
ãã©ã®ããã«åäœãããã«ã€ããŠã®ä»ã®ææ¡ã¯ã䞻芳çã«åªãã$_.Description[0].Text ??
ã«ãªããå®è£
ãå¯èœã§ããã°ããã§ãŒã³å
ã®ä»»æã®ã«ãã¯ã¢ãããã€ã³ãã§ã®é害ãäžåºŠã«åŠçããŸãã ãããã§ãããã©ã«ãã§äœããããããéžæã§ãã $null
ã ãã«å¶éãããã®ã§ã¯ãªããèªç±ã«å¥ã®ãã©ãŒã«ããã¯ã䜿çšã§ããŸãã
äœè«ã§ããããã®?.
æ§æã«ã¯ãéçããããã£ãšã¡ãœããã®é¡äŒŒç©ãã€ãŸã$t = [int]; $t::MaxValu; $t::Pars("1")
?::
ãŸããïŒããã¯?:
ãŸãã¯?::
ãŸããïŒ
è€æ°ã®ã€ã³ããã¯ã¹ãæå®ãããé
åã€ã³ããã¯ã¹ã®æãŸããåäœã¯äœã§ããããïŒ $array[0,4?,1,2]
ããããã倱æããããšãèš±å¯ãããå ŽåããŸãã¯$array[0,4,1,2?]
ã§ããããå
šäœã®ã¿ãæåãŸãã¯å€±æããããšãèš±å¯ãããŸããïŒ
å°ãªããšãæŠå¿µçã«ã¯ãåé¢ãã䟡å€ã®ããåŽé¢ãæ··åããŠããããšã«æ°ä»ããã®ã§ãæåã«äžæ©åŸéããå¿ èŠããããŸãã
_Null-value_-CïŒã®å Žåã®ããã«ãæ¡ä»¶ä»ãã¡ã³ããŒãŸãã¯ã€ã³ããã¯ã¹ã¢ã¯ã»ã¹ïŒ
$null
å Žåããã®ã¡ã³ããŒã«ã¢ã¯ã»ã¹ãããããã®ã¡ã³ããŒã«ã€ã³ããã¯ã¹ãä»ãããããè©Šã¿ãç¡èŠããŠã $null
ãšè©äŸ¡ããŸãã_Member-existence_-PowerShellã«åºæã®æ¡ä»¶ä»ãã¡ã³ããŒãŸãã¯ã€ã³ããã¯ã¹ã¢ã¯ã»ã¹ïŒ
$null
_ã®å Žåãååšããªã_members_ïŒããããã£ãã¡ãœããåŒã³åºããã€ã³ããã¯ã¹ä»ãïŒã«ã¢ã¯ã»ã¹ããããšããè©Šã¿ã¯ç¡èŠããŠãã ããã泚ïŒç°¡æœã«ããããã«ãããã§ã¯_member_ããã倧ãŸãã«äœ¿çšããŠããããè¡šèšã§ã¯ãªã_indexing_ã§ã¢ã¯ã»ã¹ãããã³ã¬ã¯ã·ã§ã³ã§ãããªããžã§ã¯ãã®_elements_ãå å«ããŠããŸãã
ã³ãŒãã«ã¿ã€ããã¹ããªãããšã確信ããŠããå Žåã¯ãå¿ ãããã©ã«ãã®åäœïŒå³å¯ã¢ãŒãããªãïŒãå©çšããŠãã ãããããããã°ããïŒã¯å¿ èŠãããŸããã ïŒããããã£ã¢ã¯ã»ã¹çš
@ mklement0 ããã人ãèªåã®ã³ãŒããæ¹åããããã«strictã¢ãŒãã䜿çšããŠããããšãã芳ç¹ãã話ããŠãããšæããŸããããä»ã®èª°ããç§ã®ã³ãŒããstrictmodeã§å®è¡ã§ããã®ã§ãããã©ã®ãããªå€æŽãå ãããšãç§ã®ã³ãŒããæ©èœããããã«ãªããŸããïŒ ããããŠããã¯ç§ãå¥ã®æšè«ã«å°ããŸãã ?.
ã䜿çšãããšã .
代ããã«äœ¿çšããŠãã³ãŒããstrictmodeã§ãæ©èœãããã®ã§ãã©ãã§ãç¿æ
£çã«äœ¿çšããã»ããããã§ãããã ç§ã¯äœã倱ãããšãªããäºææ§ãç²åŸããŸãã ããå€ãã®å Žåã«ãæ©èœãããããããã¹ãŠã®PowerShellã³ãŒãããã®ããã«éããªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãã
ãã ããããã¯ããããã€ã³çœ®æã§ã¯ãããŸãããããã¯ãéstrictmodeã§å€±æããã¡ãœããåŒã³åºãã«ãã¯ã¢ãããç¡é³ã«ããstrictmodeã§å€±æããããããã£ã«ãã¯ã¢ãããç¡é³ã«ããããã§ããããã¯ãéåžžã«äžè¬çãªæäœã§ããã¡ã³ããŒã«ãã¯ã¢ããã«åä»ãªãã¥ã¢ã³ã¹ãè¿œå ããŸãã ãã€ã©ãŒãã¬ãŒããç°¡åã«ããããšã§ãstrictmodeãã§ãã¯ã®æ©æµãåããã人ã«ã¯åœ¹ç«ã¡ãŸããã ãããè¿œå ããè€éãã®ããã«ãããã¯ååãªç¶æ³ã§ååãªäººã ãå©ããŸããã ãããŠãã³ãŒãã®äºææ§ãé«ããã®ã¯äŸ¿å©ãããŸãããã³ãŒããæãŸãªãå Žåã¯ç¡èŠããããšããã®ã¯ãã³ãŒããå¯ãä»ããªãã»ã©åŒ·åã§ã¯ãªããšæããŸãã
PowerShellã¯ãèªåå€æ°ã®èšå®ããäŸå€ãã¹ããŒãããŠèå°è£ã§æ²é»ããåäŸããããªã©ãCïŒã§ã¯ã§ããªãããšãå®è¡ã§ããŸãã ã¡ã³ããŒã®æ€çŽ¢ããŸã£ããè€éã«ããªããããè¯ãã¢ãããŒããå¿ èŠã§ãããå³å¯ã¢ãŒãã®å®å šãã§ãã¯ã®å®åæãç°¡çŽ åããŠããã§ãã¯ã䜿çšããã人ãããç°¡åã«ç掻ãããã§ãã¯ã«æ©ãŸããã人ãããç°¡åã«ç掻ã§ããããã«ããŸãã
@HumanEquivalentUnitã©ããã£ãŠãããã®ãã®ãæ²é»ãããã®ã§ããïŒ ä»£ããã«ãäºåã«å€§éã®äŸå€åŠçãšnullãã§ãã¯ãäœæããå¿ èŠããããŸãã
$prop = $item?.Method().PropIwant ?? 'PropActionFailed'
vã
$prop = if ($null -ne $item) {
$propIwant= $item.Method().PropIwant
if ($null -eq $propIwant) {
'PropActionFailed'
}
else {
$propIwant
}
}
ãããŠããã®ã±ãŒã¹ã¯çããããšã§ã¯ãããŸããã ãŸãã¯ã $ErrorActionPreference = 'Stop'
ãã¹ããŒããå
šäœãtry/catch
ã§ã©ããããŠãæªããã¿ãŒã³ã§ããnullãã§ãã¯ãåçŽåããŸãïŒäŸå€é§ååããžãã¯ïŒã
ãŸããããã¯èšèªã®æªæ¥ã§ããã5.1ã«æ»ã£ãŠç¶æ³ãå€ããããã§ã¯ãããŸããã ããå€ãã®ã¢ããã¿ãŒãå¿ èŠãªå Žåã¯ãã³ãŒããèªã¿ãããããå¿ èŠããããŸãããã®ææ¡ã¯ããã ãšæããŸãã
@ mklement0 ã_èªåã®ã³ãŒããæ¹åããããã«å³å¯ã¢ãŒãã䜿çšããŠãã人_ããšãã芳ç¹ãã話ãåã£ãŠãããšæããŸããã_ä»ã®èª°ããå³å¯ã¢ãŒãã§ã³ãŒããå®è¡ã§ããŸããã©ã®ãããªå€æŽãå ãããšãã³ãŒããæ©èœããããã«ãªããŸããïŒã _ "
ãset-euopipefailãïŒbash strictã¢ãŒãïŒã«çžåœãããã®ã«ã€ããŠè©±ããŠããã®ã§ããïŒ
a-å€æ°ã«ãã¯ã¢ãããžã®å¶éïŒã¡ã³ããŒã«ãã¯ã¢ããã®åçŽãªnullãã§ãã¯ãæªãããšã ãšæãçç±ã¯ããããŸããããå®éã®ã¡ã³ããŒã«ãã¯ã¢ããã¯if (result is null)
ãããã¯ããã«é«äŸ¡ã§ãïŒ
b-ã¹ã³ãŒã/ã³ãŒããããã¯ã§[Strict]
ã䜿çšããŠãããŒãµãŒã«ãããããã®ããã«æ±ãããã«æ瀺ããŸãã
c-å³å¯æ§ã¯ã¹ã³ãŒãã«åºã¥ããŠããŸããå³å¯ãšããŒã¯ãããŠããªãã³ãŒãã¯å³å¯ã§ã¯ãããŸããã
䜿çšãããšå€±æããå³å¯ãªã³ãŒããæžããå Žåãç§ãã¡ã®1人ãééããç¯ããŸããã ãã¹ãããããšã®ãªãã³ãŒãã§æ¬ èœããŠããå€æ°ãåç §ããããé¢æ°ã«æž¡ãããªãå€æ°ã®ååšã«äŸåããäžé©åã«èšèšãããAPIã誀解ããå ¥åããããšäºæ³ãããå€æ°ãå ¥åã§ããŸããã§ããã ã
# Their code
Function Log($Message) { Write-Host $Massege } # not strict
# My code
[Strict]
Function DebugMsg
{
Param([String] $Message)
if ($DEBUG) { Log Host $Message }
}
# Your code
DebugMsg "Hello" # you didn't define DEBUG, and by saying strict I expressed a contract whereby the variable MUST be defined.
ããã°ãæ©èœã¯å³å¯ã«ããŒã¯ãããŠããªããããã¿ã€ããã¹ã«ã€ããŠæå¥ãèšãããšã¯ãããŸããã
ð€ãã£ããããšããã [Strict()]
å±æ§ã¯ãã¹ã³ãŒããå¶éãããæ¹æ³ã§strictã¢ãŒããå®è£
ããããã®_çŽ æŽããã_æ¹æ³ã«ãªããŸãã ããã¯ãå³å¯ã¢ãŒãã®åé¡ã«é¢ããä»ã®åé¡ã¹ã¬ããã§èšåããå¿
èŠããããŸãããããæãäžããŠãããã«ãªã³ã¯ããŸã...
@ TheIncorrigible1 ããããã®ããšãã©ã®ããã«æ²é»ãããŸããïŒ ãéå³å¯ã¢ãŒãã§ã¯$null.x
ã¯æ²é»ãã $null.x()
ã¯äŸå€ã§ãã 説æããããã«?.
ã§ã¯ã $null?.x
ã¯ç¡é³ã§ã $null?.x()
ã¯ç¡é³ã§ãã
ãããã£ãŠãäŸå€ãã¹ããŒããstrictã¢ãŒããé€ããŠãCïŒã®?.
ã®ããã«æ©èœãã.
ãããŸãã 次ã«ãCïŒã®?.
ã®ããã«å³å¯ã¢ãŒãã§åäœãã?.
ããããPowerShellã®.
ã¯éå³å¯ã¢ãŒãã§åäœããŸãããPowerShellã®.
ãšã¯åââäœãç°ãªããŸããã¡ãœããåŒã³åºãã®éå³å¯ã¢ãŒãã§ã¯?.
ãæããã«åªããŠããŠããããã®ã·ããªãªã®å€ãã§ãã圹ç«ã€çµã¿åããïŒã
代ããã«ãäºåã«å€§éã®äŸå€åŠçãšnullãã§ãã¯ãäœæããå¿ èŠããããŸãïŒ
$prop = $item?.Method().PropIwant ?? 'PropActionFailed'
ã¡ãœããåŒã³åºããã¹ããŒããããã$ nullãè¿ãããPropIWantãæ¬ èœããŠããå¯èœæ§ããããŸãããããã§ã次ã®ããã«èšè¿°ããå¿ èŠããããŸãã
$prop = try {
$item?.Method()?.PropIwant ?? 'PropActionFailed'
} catch [someMethodException] {
'PropActionFailed'
}
察ç§ã®ææ¡ãã??
ïŒãã«ããå¯èœã ã£ãå ŽåïŒãããã³?.
ã®å¿
èŠã¯ãªããæ°ã«ãªãã®ããæåãã©ãããã ãã®å Žåã®ã¡ãœããäŸå€ã®èããããã±ãŒã¹ãã«ããŒããŠããŸãã詳现ãªãšã©ãŒåŠçã¯ãããŸããã
$prop = $item.Method().PropIWant ?? 'AnythingFailed'
ããå€ãã®ã¢ããã¿ãŒãå¿ èŠãªå Žåã¯ãã³ãŒããèªã¿ãããããå¿ èŠããããŸããããã¯ããã®ææ¡ãè¡ããšæããŸãã
PowerShellã§.
ãšå
¥åããé »åºŠã¯ã©ããããã§ããã .
ãš?.
ã®éããæ°ãããŠãŒã¶ãŒã«èª¬æãã .
æ°žé ã«å
¥åãããã³ã«éããèæ
®ããå¿
èŠãããããšãã©ã®ãããã®é »åºŠã§èª¬æã
ããããã©ãããŠãããªããšãèµ·ãã£ãã®ïŒã ãCïŒã§ã¯.
ãã¡ã³ããŒã®æ¬ èœã«å¯ŸããŠäŸå€ãã¹ããŒããã®ã§ã圌ãã¯?.
ãçºæããŸããããããã§ã¯ãããŸããã§ãããããã¯çŽ æŽãããããšã§ãããããã©ã«ãã§ãPowerShellã§.
ã¯ã¹ããŒããŸããã次ã«ã .
CïŒã®ããã«åäœããããã®ã³ã³ããã¹ãã§ã®ã¿ã¹ããŒããstrict-modeãçºæããŸããããã¡ã³ããŒãæåã§ãã§ãã¯ããæ¹æ³ã¯éåžžã«é¢åã§é¢åã§ã誰ãå
¥åããããããŸããã§ããããã®åé¡ã«æ£é¢ããåãçµã¿ãstrictmodeã®æ©æµãåããããã«ããããã䟿å©ã«ãã代ããã«ã圌ãã¯ããããããã代ããã«CïŒã®?.
䜿ã£ãŠãããªããèŠæ±ããå³æ Œãããåå£ãªæ¹æ³ãåŸãŸããããããŠãããªãã¯ãŸã ã¡ã³ããŒã®ååšãã¹ããæã£ãŠããããstrictmodeã®æ©æµã¯ãŸã èšèã§é¢åã§ãããå°ãªããšããstrictmodeãã«ã¯ãnormalmodeããšã¹ã±ãŒãããããããã®ã§ãããã«èŠããå¿
èŠã¯ãããŸããä»ãã ããã
䜿çšãããšå€±æããå³å¯ãªã³ãŒããæžããå Žåãç§ãã¡ã®1人ãééããç¯ããŸããã
ã¡ã³ããŒã«ãã¯ã¢ããã®åçŽãªnullãã§ãã¯ãæªãããšã ãšæãçç±ã¯ããããŸããããå®éã®ã¡ã³ããŒã«ãã¯ã¢ããã¯ïŒçµæãnullïŒã®å Žåãããã¯ããã«ã³ã¹ããããããŸãã
ããã¯æªãããšã§ã¯ãªããšæããŸããPSnon-strictmodeã¯ãã§ã«ãããè¡ã£ãŠããŸããããã¯ãææ¡ããã?.
æãŸãã代æ¿æ段ã«ãªããšæããŸããããã¯éåžžã«ç°ãªããããå€ãã®ç¶æ³ã§åœ¹ç«ã¡ãŸãã
ãã ããPSã§ã¯CïŒã§ã¯ã§ããªãããšãå®è¡ã§ããããšã«æ³šæããŠãã ããã
(1..3)[1kb..100kb]
éstrictmodeã§ãäŸå€ã¯ãããŸããã æ°å€ãå€æŽããŠãæèŠæéã確èªããŠãã ããã ããã©ãŒãã³ã¹ãšãä»»æã®ãªããžã§ã¯ãã«ã€ã³ããã¯ã¹ãä»ããããã«èå°è£ã§ã©ã®ããã«æ©èœããå¿ èŠãããããå€æãããšã䟿å®äžãå®éã«ã¯æ倧100,000ã®äŸå€ãçºçããŠæ²é»ããŠããããã§ãã PSã¯ãåžžã«ãã§ããã ãéãããå¿ èŠãããããŠãŒã¶ãŒã«äžäŸ¿ããããããšããéžæãããããã§ã¯ãããŸãããç§ã¯ããã奜ãã§ãã
@HumanEquivalentUnitãã£ãªã¢ã§äœ¿çšããããšã®ãªããã¹ãŠã®èšèªã«ã¯å€ãã®æ©èœããããã¹ã¿ã€ã«ãæ°ã«å
¥ããªãå Žåã¯åé¡ãããŸããããããã®æ©èœã䜿çšããå¿
èŠã¯ãããŸããã ãªãå³å¯ã¢ãŒãããªãã«ããŠããã®ãããããŸããã ããã¯ã¹ã¯ãªããã§ã®è¯ãç¿æ
£ãªã®ã§ãèšèªã«åé¡ã飲ã¿èŸŒãŸããã®ã§ã¯ãªããæèçã«åé¡ã«å¯ŸåŠããŸãïŒãããŠãæ¬è³ªçã«ãã©ãã«ã§ãæé»ã®ç©ºã®ãã£ãããããã¯ããããŸãïŒã ç¹°ãè¿ãã«ãªããŸããããã®æ©èœã䜿çšããªãããšãæè¿ããŸãïŒããšãã°ã Out-Default
䜿çšããããšã¯ãããŸããïŒã
ãŸããæŒç®åã¯?
ã§ã¯ãªã?.
ã§ãã ã€ã³ããã¯ã¹ã¢ã¯ã»ã¹ã§ãæ©èœããŸãã
ãããªãè°è«ã®ããã®åºç€ãç¯ãããã«ç¶è¡ããã«ã¯ãç§ã¯æ¢åã®å³æ Œãªã¢ãŒããïŒçšèªãå°å ¥ããã以äžïŒïŒ
以äžã®åã¯Set-StrictMode
èšå®ãè¡šããåã®å€ã¯æ¬¡ã®ããšã瀺ããŠããŸãã
äœè«ã§ããããšã©ãŒã_script_-terminationã§ã¯ãªã_statement-_ã®ã¿ã§ãããšããäºå®ã¯ãPowerShellã®ãšã©ãŒåŠçã«é¢ãããã倧ããªè°è«ã«é¢é£ããŠããŸã-https ïŒ//github.com/PowerShell/PowerShell-Docs/issues/1583ãåç §ããŠ
$obj
_itself_ã¯$null
ã§ãïŒæ§ç¯| -ãªã| -ããŒãžã§ã³1 | -ããŒãžã§ã³2 | -ããŒãžã§ã³3以é
---------- | ---- | ---------- | ---------- | ------------
$ obj | ð| ð«| ð«| ð«
$ obj.Prop | ð| ð| ð«| ð«
$ obj [42] | ð«| ð«| ð«| ð«
$ obj.MethodïŒïŒ| ð«| ð«| ð«| ð«
-Off
ãš-Version 1
ã§ã¯ã $obj.Prop
ãèš±å¯ãããŠããã®ã«å¯Ÿãã $obj[42]
ã¯èš±å¯ãããŠããªãã®ã¯äžæè°ã§ãã
$obj
ã¯$null
以å€ã§ãããã¢ã¯ã»ã¹ãããŠããã¡ã³ããŒ/èŠçŽ ã¯ååšããŸããïŒæ§ç¯| -ãªã| -ããŒãžã§ã³1 | -ããŒãžã§ã³2 | -ããŒãžã§ã³3以é
---------- | ---- | ---------- | ---------- | ------------
$ obj.Prop | ð| ð| ð«| ð«
$ obj [42]ïŒã€ã³ããã¯ã¹å¯èœïŒ| ð| ð| ð| ð«
$ obj [42]ïŒçŽ¢åŒä»ãäžå¯ïŒ| ð| ð| ð«| ð«
$ obj.MethodïŒïŒ| ð«| ð«| ð«| ð«
æ¬è³ªçã«ã€ã³ããã¯ã¹ä»ãå¯èœãªãªããžã§ã¯ãïŒé
åãªã©ïŒã-Version 2
ã§ãååšããªãèŠçŽ ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããã®ã«å¯Ÿããã¹ã«ã©ãŒïŒPowerShellãã³ã¬ã¯ã·ã§ã³ãšã®çµ±ååŠçã®ããã«ã€ã³ããã¯ã¹äœææ©èœãæäŸããïŒãèš±å¯ããªãã®ã¯äžæè°ã§ãã
StrictMode latestã§å®è¡ããååšããå Žåãšååšããªãå Žåãããããããã£ã«ã¢ã¯ã»ã¹ããããšããå Žåã nullãœãŒãã³ã°ïŒ
function Get-OptionalPropertyValue($object, [string] $propertyName) {
if (-not ([bool] (Get-Member -InputObject $object -MemberType Properties -Name $propertyName))) {
return $null
}
$object.$propertyName
}
$value = Get-OptionalPropertyValue $foo "bar" # if $foo.bar exists, $value will contain its data; else $value will be $null
ããªãã_æ¬åœã«_æžãããšãã§ããã¯ãã®ãšãïŒ
$value = $foo?.bar # if $foo.bar exists, $value will contain its data; else $value will be $null
ã¿ããªãããªãã¯ãã®ææ¡ããã®ã¿ãã«æ¡ä»¶ä»ãåŸãããšãã§ããå Žåã«ã¯ãå®è£ ãããããããã£ã ãã®ããã«ãããã¯å€ãã®èŠçã®ã§ãéåžžã«å€ãã®äººã ãæãã ããããŠãã ããã
ç§ã¯ããã調ã¹å§ããããã€ãã®åé¡ãèŠã€ããŸããã
??
ãš?=
èããŠã¿ãŸããã
$x ?= 1
ãš$x ?? 1
ã¯ç°¡åãªããã§ãã ãã ãããããã¯æŒç®åã§ããããã $x?=1
ãš$x??1
ããµããŒãããå¿
èŠããããŸãã
ããã«äŒŽãåé¡ã¯ã $x?
ãš$x??
äž¡æ¹ãPowerShellã®å€æ°åãæ€èšŒããããšã§ãã æ確ã«ããå¯äžã®æ¹æ³ã¯ã ${x}?=1
ãš${x}??1
ã§ãã
ããã«ãæ¡ä»¶ä»ãã¡ã³ããŒã¢ã¯ã»ã¹?.
ãš?[]
å Žåã ${x}?.name
ãš${x}?[0]
ãŸãã
ãããã®å Žåã $x ?.name
ããã³$x ?[0]
ã¯ãµããŒããããŸããã
ãã1ã€ã®ãªãã·ã§ã³ã¯ãé倧ãªå€æŽãå°å
¥ããå€æ°åã«?
ããŸã£ããèš±å¯ããªãããšã§ãã
ã©ãæããŸããïŒ @ mklement0
/ cc @rjmholt @ daxian-dbw @JamesWTruher
?
ãæå¹ãªå€æ°åã§ããçç±ãç¹ã«_奜ã_ãç解ãããŠããŸããã $Safe?
ãããªååã®æãéãããŸããããã¯ããšã«ãã$IsSafe
æžããšãäžè¬çã«ãããããããæ±ãã«ãããªããŸãã
å€åã¯ããããé·ãéç¶ããŠãããšæããŸãã
ããã¯$ Safeã®ãããªååã®æãéããŸããïŒ ãšã«ãã$ IsSafeãšæžããšãäžè¬çã«ã¯ããæ確ã§æ±ãã«ãããªããŸã
èå³æ·±ãããšã«ãç§ã¯å察ã®ææ ãè¡šæããŸããã ããã¯å€å žçãªScheme / Rubyã®äŒçµ±ã§ãã
if ($questionMark?)
{
Write-Host "That's silly!"
}
äžé
æŒç®åã«ãåãåé¡ããããŸããã§ããã解決çã¯ã ?
ã§çµããå€æ°ãé©åã«åŠçããããã«ãæŒç®åã®ååŸã«ã¹ããŒã¹ãå¿
èŠãšããããå€æ°åãäžæ¬åŒ§ã§å²ãããš
ãããã®æŒç®åãå°å
¥ããããšãPowerShellã¯$x?[0]
ãªã©ã®æ§æã§?
ãæŒç®åã®äžéšãšããŠèªèããããšãåªå
ãã ?
çµããå€æ°åã䜿çšãããŠãŒã¶ãŒã䜿çšã§ããããã«ãªããšæããŸããã³ã¬ã¯ã·ã§ã³ãæ ŒçŽããããã®${x?}?[0]
ã $x?.Name
ãš${x?}?.Name
åäžã
ä»ã®ãªãã·ã§ã³ã¯ãé倧ãªå€æŽãå°å ¥ããèš±å¯ããªãããšã§ãã å€æ°åã«ã¯ãŸã£ããå«ãŸããŠããŸããã
ðããã¯ã¡ãžã£ãŒããŒãžã§ã³ã®å€æŽïŒ6ãã7ïŒã§ããããšãèãããšãããã§é倧ãªå€æŽãå ãã䟡å€ããããšæããŸãã GitHubã«ã ?
ã§çµããPSå€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãããã€ãããã確èªããããã®ããè¯ãã³ãŒãæ€çŽ¢ãããã°ããã®ã«ãšæããŸãã ããã¯ããã»ã©åœ±é¿ã¯ãªããšæããŸãããGitHubã«å¯ŸããŠããã確èªããã®ã¯è¯ãããšã§ãã PowerShellã䜿çšããŠ14幎éãå€æ°åã«?
ã䜿çšããããšã¯ãããŸããããããã¯ç§ã ããããããŸããã :-)
ãã®è¹ã¯ãã£ãšåã«åºèªããŠãããä»æ¥ã®ã¹ã¯ãªããã§?
ã§çµããå€æ°ã䜿çšãããŠããã®ãèŠãŠãé©ããªãã§ãããã
ãã®æç¹ã§ããããã®æ°ããæŒç®åã«é¢ããŠãå€æ°åã®äžéšãšããŠã§ã¯ãªããæŒç®åã®äžéšãšããŠ?
解æãåçŽã«åªå
ããå Žåã ?
çµããå€æ°åã䜿çšãã人ã
ã¯å¿
èŠã«ãªããŸãã {}
ãŸãã¯ã¹ããŒã¹ïŒã¹ããŒã¹ãèš±å¯ãããŠããå ŽåïŒã䜿çšããŠããããã®æŒç®åã§ãããã®å€æ°ã䜿çšããŸãã
ãã®æèã§ããã®è¹ãåºèªããããšããèšèãèãã®ã¯å¥åŠã§ãã ããã¯_ã¡ãžã£ãŒããŒãžã§ã³_ã®å€æŽã§ãã ãããããã§å€ããã®ã¯äžåçã§ã¯ãªããšæããŸãã
@rkeithhillç§ã¯å人çãªãã®ã§ããã䜿çšããŸããããå€æ°åã®äžéšãšããŠèšå·ã䜿çšããããšã¯ããã°ã©ããŒã«ãšã£ãŠéåžžã«çŽæçã§ã¯ãªããããå ±åäœæ¥ãè¡ãããšã¯äžæ確ã ãšæããŸããïŒå€æ°ãšããŠçµµæåã䜿çšããã®ãšåæ§ïŒ
ãåªå 解æããè¡ã@KirkMunroã¯ããã°ã®æãéããŠããããã«èãããŸãã
@ vexx32 ïŒããã¯ã¡ãžã£ãŒããŒãžã§ã³ã®å€æŽã§ãããããé倧ãªå€æŽãè¡ãã®ã¯äžåçã§ã¯ãããŸããã ãŠãŒã¶ãŒãã§çµããå€æ°ã䜿çšããå¯èœæ§ããããããããããã®ãããªç Žå£ã®å€æŽã®ããã®ããŒã¯éåžžã«é«ããŸãŸã«ããŠãã ããããšç§ã¯ãããè¿ããšããããŒãæž¡ãã«æ¥ãªããšæããŸã?
ããŸãéãã圌ãã䜿çšããŠ{}
å€æ°åãèå¥ããããã®
?
ã§çµããããããã£åãä»ããããšãã§ããŸãã çŸåšãååãåŒçšç¬Šã§å²ãŸãã«PowerShellã§ãã®ãããªããããã£ã衚瀺ããããšãããšãããŒãµãŒãšã©ãŒãçºçããŸãã
äŸãã°ïŒ
PS C:\> $o = [pscustomobject]@{
'DoesItBlend?' = $true
}
PS C:\> $o.DoesItBlend?
At line:1 char:15
+ $o.DoesItBlend?
+ ~
Unexpected token '?' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken
PS C:\> $o.'DoesItBlend?'
True
ä»æ¥ã¯è§£æãããªãããšã«å°ãé©ããŠããŸããïŒãªã解æãããªãã®ã§ããïŒïŒãããã«ããããããããã®ãããªããããã£ã®å Žåã¯ãååãåŒçšç¬Šã§å²ãå¿
èŠããããŸãããã®å ŽåãåŒçšç¬Šã®åŸã«3é
nullãä»ããããšãã§ããŸãã -ã¹ããŒã¹ã®ãªãåäœãªã©ã®æŒç®åãåé¡ãªãåäœããŸãã ãã®æ§æã¯${x?}?.name
ã«éåžžã«äŒŒãŠãããšæããŸããå¿
èŠã«å¿ããŠããã®ãããªå€æ°/ããããã£åã䜿çšã§ãããšããã¹ã¿ã³ã¹ã§åé¡ãããŸãããããã®ãããªååã§ã¯ã3é
ãŸãã¯nullãåŠçããããã«è¿œå ã®æ§æãŸãã¯ééãå¿
èŠã«ãªãå ŽåããããŸãã -*æŒç®åã
@KirkMunroé£è§£ãªå€æ°åãå¿ èŠãªå Žåãä»åŸãå€æ°ã®å¢çã䜿çšããããšã
PowerShell 7ã䜿çšããŠãã人ã¯ããã§ã«ç±ççã§ãããé倧ãªå€æŽã«æ°ä»ãã§ãããã ããã§ãªã人ã¯ããŸã <= v5.1ã䜿çšããŠãããé·æé䜿çšãç¶ããŸãã ããããmsftããããWindows10ããåé€ãããŸã§ïŒæ±ºããŠïŒã
@KirkMunroãã¡ããã§ãããæšæºã®èš±å®¹å€æ°æåããåé€ããŠãããŠãŒã¶ãŒãå€æ°åãšããŠ${Valid?}
ãå®è¡ããããšã劚ããããšã¯ãããŸããã ãããã®æŒç®åã䜿çšããå¿
èŠãããããã ?
å€æ°åã®äžéšãšèŠãªãããæåã«ããããããäžè²«æ§ãæãããæ¹ããããšæããŸãã
ããã¯ãã§ã«å£æ» çãªå€åã«ãªãã§ãããããããŠç§ã¯å°ãªããšãããã«ã€ããŠäžè²«ããŠããŠãå¥ã®ã¬ãã«ã®ææ§ããå°å ¥ããããããã£ãšè¡ãããšãæåã ãšæããŸãã ð
@adityapatwardhanèšèªã§ã¯ãæå¹ãªå€æ°æåãšããŠ?
ãåé€ããæ¹ããããšæããŸãã ããã«ãããnull-soak / -coalesceæŒç®åãšäžé
æŒç®åã®äž¡æ¹ã䜿ãæ
£ããæ§æã§ç°¡åã«æå¹ã«ãªããã¹ã¯ãªããã®äœæããã»ã¹ã«å€ãã®äººéå·¥åŠãè¿œå ãããŸãã
ãåªå 解æããè¡ã@KirkMunroã¯ããã°ã®æãéããŠããããã«èãããŸãã
@ TheIncorrigible1 ïŒé©åã«å®è£
ãããŠããªãå Žåãã©ã®ã³ãŒãã§ããã°ã®å¯èœæ§ããããŸãã PowerShellãå€æ°ã®å¢çã§å²ãŸããŠããªãå€æ°åã解æãã ?
æåã«ééãããšãã«ãPowerShellãäžé
æŒç®åãŸãã¯null- *æŒç®åã«ééãããã©ãããèå¥ããããã®ãåçŽãª1æåã®å
èªã¿ã«ã€ããŠè©±ããŠããã ãã§ãã ããã¯è€éã§ã¯ãªããä»ã®ã³ãŒãå€æŽãããå€ãã®ãã°ã®æãéãããšã¯ãããŸããã
PowerShell 7ã䜿çšããŠãã人ã¯ããã§ã«ç±ççã§ãããé倧ãªå€æŽã«æ°ä»ãã§ãããã ããã§ãªã人ã¯ããŸã <= v5.1ã䜿çšããŠãããé·æé䜿çšãç¶ããŸãã ããããmsftããããWindows10ããåé€ãããŸã§ïŒæ±ºããŠïŒã
@ TheIncorrigible1 ïŒãã®å£°æã®æ ¹æ /蚌æ ã¯äœã§ããïŒ PowerShell 7ã¯ãã¬ãã¥ãŒæ®µéã«ãããããçŸåšã¯æ奜家ã®ã¿ã䜿çšããŠããŸãã ããã¯åœç¶ã®ããšã§ãã ãã ãããã¬ãã¥ãŒãè¶ ããŠãPowerShell 7以éãäŒæ¥ã«å¿ èŠãªé åçãªæ©èœãæäŸããå¿ èŠãªæ©èœããµããŒãããŠããå Žåã¯ããããã®ããŒãžã§ã³ã䜿çšããŸãã ããã¯ãPowerShell7ãOSãšãšãã«ã€ã³ã¹ããŒã«ãããå Žåã«ç¹ã«åœãŠã¯ãŸããŸãã ç±ççãªãã¡ã³ãé¢äžããå¯äžã®ãã€ã³ãã¯ãPowerShell7ããããããã®ã«å¯Ÿããããžãã¹äžã®ããŒãºããªãçµç¹ã«ãããŸãã
ããã¯ãã§ã«å£æ» çãªå€åã«ãªãã§ãããããããŠç§ã¯å°ãªããšãããã«ã€ããŠäžè²«ããŠããŠãå¥ã®ã¬ãã«ã®ææ§ããå°å ¥ããããããã£ãšè¡ãããšãæåã ãšæããŸãã ð
@ vexx32ããã¯ããã䌞ã°ããŠããŸãã å€æ°åã«??
ãããå Žåãããã¯é倧ãªå€æŽã«ãªããŸããããã®å¯èœæ§ã¯ãååãåäžã®?
çµããå€æ°ãæã€ãããã¯ããã«é ãã§ãã ãã以å€ã«ãä»æ¥ã®æšæºã®èš±å®¹å¯èœãªå¯å€æåãã¬ãŒã¯ã¹ã¯ãªãããšããŠ?
ããµããŒãããªãããnull- *æŒç®åãå°å
¥ããã«ã¯ã©ãããã°ããã§ããããã
ç§ã®çµéšã§ã¯ã䟿å©ãªãã®ïŒããã¯ããæãããïŒã®å€æŽãå£ãããšã¯ãæåŠãããªãå Žåãã¯ããã«å€ããããããåãå·»ãè°è«/è°è«ã¯ãç©äºãåçã«è¡ãããã»ã¹ãé ãããã®ã«åœ¹ç«ã€ã ãã§ããç©äºãè¡ãè©°ãŸã£ããããªãªãŒã¹ã«å ¥ãã®ãéããããããã€ã³ããªã©ãé倧ãªå€æŽãææ¡ããå Žåã¯ã圱é¿ãè©äŸ¡ããŠãã®ãããªå€æŽãæ£åœåã§ããããã«ããããã«èšŒæ ãå¿ èŠã«ãªããããã¹ããŒããŠã³ãå¿ èŠã«ãªãããšããããããŸãã ä»æ¥ããã®èšŒæ ãéããã®ã¯é£ããã§ãã ç§ã¯ãããèšã£ãŠããã®ã¯ããã€ã§ã䟿å©ãªç Žå£çãªå€æŽã«ã€ããŠè°è«ããããããä»ããæ©èœãå®è¡ããããšãéžæããããã§ãã
å€æ°åã«?
ã䜿çšããããšã¯ãããŸããããŸãã䜿çšãã人ããããšæããŸããã¹ã¯ãªããã§éåžžã«ããèªã¿åãããšãã§ããPowerShell 7ã®ãšã³ããªã«äžèŠãªéå£ãèšãããšãæ¡çšãé
ããªãã ãã§ããç¹ã«ãPowerShellã䜿çšããå€ãã®äººããé倧ãªå€æŽãåŠçããããšã«æ
£ããŠããéçºè
ã§ã¯ãªãå Žåã¯ãªãããã§ãã
ãšã«ããããã®ããã»ã¹ãé ãããããšã¯ç§ã®æå³ã§ã¯ãªããããããã®éã§ãã ããããç§ã¯èªåã®èããšçµéšãå ±æããã®ã§ãããã§ç»æçãªå€æŽãæšé²ãã¹ããã©ããã«ã€ããŠã¯ãã以äžã³ã¡ã³ãããŸããã
ãã®äžèªç¶ãªäŸãèããŠã¿ãŸãããã
$ValueIsValid? = @( $true, $false, $false, $true )
$ValueIsValid?[0]
# old behaviour? gets `$true`
# new behaviour? gets nothing, because the `?[0]` is interpreted as a null-conditional access.
ãã®åäœã¯ãææ¡ãããå€æŽã§_ãã§ã«_å£ããŸãã èãããããã¹ãŠã®äŸå€ãšã ?
çªç¶ç¡å¹ã«ãªã£ããšããšå Žæãããã³ããããŸã æå¹ã§ããå ŽæãäžèŠ§è¡šç€ºããããã«åããŒãžã®èª¬æãå¿
èŠãªçŽããããäŒæ©ããããäžè²«æ§ã®ããã¯ãªãŒã³ãªäŒæ©ããå§ãããŸãã
@KirkMunro PowerShell 7以éãäŒæ¥ã«å¿ èŠãªé åçãªæ©èœãæäŸããå¿ èŠãªæ©èœããµããŒãããŠããå Žåã¯ããããã®ããŒãžã§ã³ã䜿çšããŸãã ããã¯ãPowerShell7ãOSãšãšãã«ã€ã³ã¹ããŒã«ãããå Žåã«ç¹ã«åœãŠã¯ãŸããŸãã
æ°åäžäººã®åŸæ¥å¡ãæ±ããæ°äººã®ãã©ãŒãã¥ã³50ã§åããŠããã®ã§ãOSã®ããã©ã«ãããé¢ããããšããå°é£ã§ããïŒã€ãŸããv5.xãžã®ç§»è¡ïŒã Coreãæ¡çšããŠããå Žæã¯ãŸã ãããŸããã çžäºäºææ§ã®ããã«Pythonã«ç§»è¡ãããã ãã§ãã Windowsã®ãªãã·ã§ã³æ©èœãæå¹ã«ããããšãããã£ãã«ãããŸããã§ããã
äŒæ¥ã¯ãåé¡ã解決ããããã«æ°ãããã¯ãããžãŒãèšèªããŒãžã§ã³ãæ¢ãããšã«ã€ããŠãèªåãã¡ãæã£ãŠãããã®ãšåŸæ¥å¡ã®ç¥èããŒã¹ã掻çšããŠãããšæããŸãã äžéšã®ãŠãŒã¶ãŒã¯ãv2ã«æ°žé ã«ãšã©ãŸããWin10 / Server16ã³ãã³ãã¬ããã«è§Šããªãããšã§å®å šã«æºè¶³ããã§ãããã
ããããã¹ãŠã«ã€ããŠã®ç§ã®ãã€ã³ãã¯ããããã®æ©èœãç空ç¶æ ã«ãªããšããããšã§ãã èšèªããã人éå·¥åŠçã«ãããšãåé¡ãããæ©ã解決ããããã®ããŒã«ã«é¢å¿ã®ãã人ã ã«ããæ¡çšãå¢ããã§ãããã ïŒåç §ïŒCïŒããã³ããå€ãã®/ããåªããèšèªæ©èœã«ãã人æ°ã®é«ãŸãïŒ
?
çµããå€æ°ã«é¢ããŠ-èªåå€æ°$ã®ãããããã¯é倧ãªé倧ãªå€æŽã«ãªãå¯èœæ§ããã
@lzybkrããã«å¯ŸåŠããããã®æè¯ã®ã±ãŒã¹ã¯ã $^
ãš$$
ãã§ã«ååšãããããªç¹æ®ãªã±ãŒã¹ã ãšæããŸãã
@lzybkr @ TheIncorrigible1ç§ãèŠããŠããéãããããã®å€æ°ã®$^
_ already_ã¯æå¹ãªå€æ°åã§ã¯ãããŸããã ããŒã¯ãã€ã¶ãŒã«ã¯ãæšæºã®å€æ°åã®æ€çŽ¢ãéå§ããåã«ãããããã¹ãŠã«ç¹å¥ãªã±ãŒã¹ããããŸãã
ããã§ã®å¯äžã®è§£æ±ºçã¯ã ¿
ã䜿çšããããšã§ãã
$ sillyïŒÂ¿= 1
ç§ã¯ã¹ãã£ãŒããç¥ããªããç§ã¯ããã«ã€ããŠã®ã€ã³ãããã³ã°ã®çŸ€è¡ã®äžã«ãã£ãããšããã
$silly?âœ=1
@ lzybkr-ç§ã®ç¥ãéãã $?
$$
ãš$^
ã¯ç¹å¥ãªæ¹æ³ã§æ±ãããŸãã
èŠçŽãããšããããã®4ã€ã®ãªãã·ã§ã³ããããŸã
?
ãèš±å¯ããŸããã?.
ãåªå
ããŸãã ã€ãŸãã ?
çµããå€æ°åã¯ã ${variablename}
æ§æã䜿çšããå¿
èŠããããŸãã ãŸã å£æ»
çãªå€åã?.
ãš?[]
ã䜿çšããããšãæå³ãã ${variablename}?.property
䜿çšããå¿
èŠããããŸãã é倧ãªå€æŽã¯ãããŸããããæ°ããæŒç®åã®äœ¿çšã¯äžåšçšã«ãªããŸããç§ã¯å人çã«ãæåãšæåŸã®ãã®ã奜ã¿ãŸããã
ããã¯ã¡ãžã£ãŒããŒãžã§ã³ã®å€æŽã§ãã ãããããã§å€ããã®ã¯äžåçã§ã¯ãªããšæããŸãã
éèŠãªç¹ã¯ãã¡ãžã£ãŒããŒãžã§ã³ãå¢åãããŠãWindows PowerShellã眮ãæããæºåãã§ããŠããããšã瀺ããŠããããšã§ããã€ãŸããç Žæã§ã¯ãªãäºææ§ã瀺ããŠããŸãã å ã®çºè¡šããïŒ
ã¡ãžã£ãŒããŒãžã§ã³ã¯ãé倧ãªé倧ãªå€æŽãè¡ãããšãæå³ãããã®ã§ã¯ãªãããšã«æ³šæããŠãã ããã
ãªãã·ã§ã³1ãš2ã¯åãã§ã¯ãããŸãããïŒ ãŸãã¯ãå€æ°ã®åŸã«nullåäœæŒç®åãŸãã¯3é
æŒç®åããªãå Žåã§ããå€æ°ã¯?
ã䜿çšã§ããŸããïŒ
ãããããªããç§ãã¡ã¯å€ãã®ããã¯ãã©ãã¯ãªãã§ããŒã¯ã³å/解æããžãã¯ãåŠçããã®ã«å€ãã®åé¡ããããããããªããšæããŸãã ããã«ãããå€æ°ã?
çµããå Žåãããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
ç§ãèŠãããšãã§ããããšããããªãã·ã§ã³2ãäžè¬çãªå¥œã¿ã§ããããã«æãããããšãèãããšãããã§é倧ãªå€æŽãè¡ãããšã«æµæãããããšãç§ã¯æ¬åœã«ç解ããŠããŸããã ããããããšã§ãå€æ°åãå²ãŸãªããšäœ¿çšã§ããªãã·ããªãªãå°å
¥ããã ãã§ãå€æ°åã§ã®?
䜿çšãç©æ¥µçã«é»æ¢ã§ããŸãã
é倧ãªå€æŽãé²ãã«ã€ããŠãããã¯ããªãå°ããªå€æŽã ãšæããŸããå€æ°åã§äœ¿çšã§ãããã®ãšã§ããªããã®ã®äžè²«æ§ãäžæããããšã¯ãããããæªãéžæè¢ã ãšæããŸãã
ãããã®ãã®ã«ã¯ãã»ãšãã©ãã¹ãŠã®ç¶æ³ã«é©çšãããæ確ãªã«ãŒã«ãå¿
èŠã§ãã çŸåšããããåœãŠã¯ãŸããŸãã ããã§æ°Žãæ¿ãããè¡åãæ確ã«ããããšãææ¡ããŠããŸãã ?
ãå«ãå€æ°åããäžéšã®ã·ããªãªã§äœ¿çšããã®ãé£ãããšããçç±ã ãã§äœ¿çšãããªããªãããšãé€ããŠãããããè¯ããã®ã¯äœãããããŸãã-ããã¯ïŒäºå®äžïŒãªãã·ã§ã³1ã«æ»ããŸãããã©ã«ãã§ã¯ãã»ãšãã©...ã§ããããä»äŒæ©ãåããããããŸããªåäœãé¿ããç¹å¥ãªçç±ã¯ãããŸããã
@ vexx321ãš2ã®éã«ã¯ããããªéãããããŸãã
ïŒ1ã®å Žåã ?
ãå€æ°åã§äžç·ã«äœ¿çšããããšã¯èš±å¯ãããŠããŸããã ããã¯ã $x? = 1
ã $x?? = 1
$x?x?x = 1
ã解æãããªãããšãæå³ããŸãã
ïŒ2ã®å Žåã $x? = 1
ã¯åŒãç¶ãæå¹ã§ããã $x?.name
ã¯${x}?.name
ãšåçã§ãã ããã¯ãã¡ã³ããŒã«ã¢ã¯ã»ã¹ããŠããæåŸã«?
ä»ããŠããå€æ°åã®ã¿ãåå²ããŸãã ãããã£ãŠã $x? = 1
ã $x?? = 1
$x?x?x = 1
ã¯åŒãç¶ãæå¹ã§ãã
ãããç§ã¯ããã§ãªãŒããŒããããããŒã¯ã³åããããšã«ã€ããŠå°ãå¿é ããã§ãããã äž¡æ¹ã®å¯èœæ§ãå®è£ ããåæ§ã®å€æ°åãããªãé »ç¹ã«äœ¿çšããã¹ã¯ãªããã§ããã€ãã®ãã³ãããŒã¯ãå®è¡ãã䟡å€ããããããããŸããã
ç§ã®å¥œã¿ã¯ééããªããªãã·ã§ã³1ã§ã...å°ãªããšãç§ã«ãšã£ãŠã¯ã1åéãã®å€æŽã¯ãå°æ¥ã®æ¹æ³ã§è§£æããæ¹æ³ã®äžæŽåã«å¯ŸåŠãããããã¯ããã«å¥œãŸããã§ãã
ãããããªããç§ãã¡ã¯å€ãã®ããã¯ãã©ãã¯ãªãã§ããŒã¯ã³å/解æããžãã¯ãåŠçããã®ã«å€ãã®åé¡ããããããããªããšæããŸãã ããã«ãããå€æ°ãïŒã§çµããå Žåã«ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
ç§ã¯ãã®å¯èœæ§ã«ã€ããŠãã®æžå¿µãå
±æããŸãã ?
ãæã
ããŒã¯ã³ã®åºåãæåãšããŠæã€ããšã¯ãç§ã«ã¯ãã®èšèªã®ã®ã¶ã®ã¶ã®ç·ã®ããã«æããŸãã
ãããããªããç§ãã¡ã¯å€ãã®ããã¯ãã©ãã¯ãªãã§ããŒã¯ã³å/解æããžãã¯ãåŠçããã®ã«å€ãã®åé¡ããããããããªããšæããŸãã ããã«ãããå€æ°ãïŒã§çµããå Žåã«ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
ããã¯ããªãããããã©ã®ããã«å®è£
ãããã«äŸåããŸãã ããŒã¯ã³åããŠããããã¯ã¢ããããã¢ãããŒãã§ã¯ãªããå
èªã¿ã¢ãããŒããæ¡çšããéããåé¡ã¯ãããŸããã å€æ°åã«?
ããŠããå Žåã¯ã次ã®æåãå
èªã¿ãã次ã®æåã«åºã¥ããŠå€æ°ããŒã¯ã³ãã©ã®ããã«ããŸãšããããã決å®ã§ããŸãã ããã¯ããã»ã©åé¡ã§ã¯ãªããããã¯ãã©ãã¯ãå¿
èŠãšããããããã©ãŒãã³ã¹ãèããäœäžãããããããšã¯ãããŸããã
@ PowerShell / powershell-å§å¡äŒã¯ä»æ¥ãããã¬ãã¥ãŒããŸãããç§ãã¡ã¯ããã€ãã®èããæã£ãŠããŸãïŒ
?
ã䜿çšããé »åºŠã確èªããŸãã?
ã䜿çšããŠãããŠãŒã¶ãŒã¯ãããã»ã©äžçŽè
ã§ã¯ãªãå¯èœæ§ããããšãã仮説ïŒä»ã®äººãæ€èšŒãããïŒãæã£ãŠããŸãïŒãã®éšå±ã§åæããã®ã§ãç§ãã¡ã¯ãããé¿ããŸããçºçããå¯èœæ§ã®ããæœåšçãªåé¡ã®ïŒã äžæ¹ãããã§èª¬æããæ©èœã䜿çšãã人ã¯èª°ã§ããããå°ãè€éãªæ§æïŒ ${foo}?.bar
ïŒãç解ã§ããŸãã ãããã£ãŠããããã®çµéšã®æµ
ããŠãŒã¶ãŒã®å€æŽãå£ããªãããã«ããããããŸãã ïŒãã ããæåã®ç®æ¡æžãã«åŸã£ãŠæ€èšŒããŸããïŒ$foo
ãš${foo}
䜿çšæ³ãæ··åããŠãããšãã«ããã¹ãŠã®å€æ°åç
§ãèŠã€ãã«ããããããšã«ã€ããŠè¯ãç¹ãæããŸããã ãã ããããã¯ããŒã«ïŒVS Code PowerShellæ¡åŒµæ©èœãªã©ïŒã§ä¿®æ£ã§ããVimãªã©ã®@JamesWTruherãªã©ã®ãŠãŒã¶ãŒã¯ãäž¡æ¹ãæ€çŽ¢æ§æãšç°¡åã«äžèŽãããããšãã§ããããšã«ã¹ã¯ãªããäœæè ã$ fooãš$ {foo}ã®äœ¿çšæ³ãæ··åããŠããå Žåããã¹ãŠã®å€æ°åç §ãèŠã€ããã®ãé£ãããªããŸãã
ããã¯ãASTãäžæ¬åŒ§ãèŠããã©ããã«åºã¥ããŠå€æ°åãåºå¥ãããã©ããã«ãã£ãŠç°ãªããŸãã PowerShell ASTã䜿çšããããŒã«ã¯ãããã§ã¯äžæ¬åŒ§ã«åé¡ããªãã®ã§ã¯ãªãããšæããŸãã
ããããæ£èŠè¡šçŸã®å Žåãããã¯ç¢ºãã«ããªãããã£ãšæèããªããã°ãªããªãããšãæå³ããŸãïŒ varname
-> \{?varname\}?
@rjmholtããã§åæã?
ã§çµããäžæã®å€æ°ã¯çŽ70åãããããŸãã
ãããã§ã@mburszley -ç§ã«ã¯ããã«ãªããã±ã3ïŒããããªãç°è²ã®é åã®å€æŽãã®å¿
èŠæ§ããŠãŒã¶ãŒã«è² æ
ãããã{...}
䞊åãéåžžã«æ®å¿µãªããšã§ãããããäžå¹žãªå¿
èŠæ§$(...)
ã®åšãã«exit
&&
ããã³||
ã®ã³ã³ããã¹ãã§ã®exit
/ return
/ throw
ã¹ããŒãã¡ã³ãã
ãã®åé¡ããæšè«ãåããã«ã¯ïŒ
?.
䜿çšã§ããããã«ãå€æ°åã®ååŸã«{...}
ã®äœ¿çšã匷å¶ãããšïŒ
æ°èŠãŠãŒã¶ãŒã¯{...}
ã®å¿
èŠæ§ãæåŸ
ããã以äžã倱æãããšãã«_it_ãå¿
èŠã§ããããšãå¿
ãããç¥ããŸããïŒ Set-StrictMode -Version 2
以äžãæå¹ã§ãªãéãããããã_undetected _ïŒïŒ $o = [pscustomobject] @{ one = 1 }; $o?.one
ãŠãŒã¶ãŒã{...}
ã®å¿
èŠæ§ãç¥ã£ããšããŠãïŒ
{...}
ã¯å
¥åãé£ããã®ã§ããã®äžèŠäººå·¥çãªèŠä»¶ã¯ç¶ç¶çãªãã©ã¹ãã¬ãŒã·ã§ã³ã®åå ã«ãªããŸãããã®åé¡ã¯ä¿®æ£æžã¿ãšããŠããŒã¯ãããŠããã 1æ¥éã¢ã¯ãã£ããã£ããããŸããã ããŠã¹ããŒãã³ã°ã®ããééãããŠããŸãã
@ rjmholt ã https ïŒ
æ¢åã®æå¹ãªæ§æã解æããæ¹æ³ãå£ããªãããšãæ£ããæ¹æ³ã§ããã ç¹°ãè¿ãã«ãªããŸãããå€æŽã¯ãå°æ°ã®ã¯ã€ã«ãããã°ã©ã ããµããŒãããããšã決å®ããå Žåã ãã§ã¯ãããŸãããé·æãçæãäžåã£ãŠãããšæã£ãå Žåã«ãå€ãã®é倧ãªå€æŽãå ããŸããïŒç§ãå人çã«åæããããã§ã¯ãããŸããïŒããããã®ãã¹ãŠã§ããŸãã¯ããããä»ã®äººãæ£åœåãããããªããïŒã åé¡ã¯ãããŒã¯ãã€ã¶ãŒãŸãã¯ããŒãµãŒã®äžéšã®åŽé¢ãå€æŽãããšã2ã€ã®PowerShellããŒãžã§ã³ãäžéšã®ã¹ã¯ãªããã«å¯ŸããŠåãASTãçæããªããªãããã2ã€ã®PowerShellãåãã¹ã¯ãªãããç°ãªãæ¹æ³ã§ãèªèãããããšã§ãã ã€ãŸããæ§æãåãæ¹æ³ã§èªã¿åãããšããã§ããªããããPSScriptAnalyzerã«ãŒã«ãèšè¿°ããŠããã®åšãã§çºçããå¯èœæ§ã®ããåé¡ãæ€åºããããšã¯ã§ããŸããã PSScriptAnalyzerã¯ãPowerShellã®ããŒãžã§ã³ããšã«ç°ãªãæ§æã衚瀺ããŸãã
CïŒãšã¯ç°ãªããPowerShellã¯ãåŸã§å®è¡ããããã«äºææ§ã®ãã圢åŒã«ç°ãªãæ§æãããªã³ã³ãã€ã«ããããšã¯ã§ããŸãããã€ãŸããæ§æã®å€æŽã¯ã©ã³ã¿ã€ã ã«é¢é£ä»ããããŸãã PowerShellãæ§æãäžæãããšãç°ãªãããŒãžã§ã³ã«å¯ŸããŠæ©èœããã¹ã¯ãªããã®æ°ãæžããŸããã€ãŸãããŠãŒã¶ãŒã¯2ã€ã®ã¹ã¯ãªãããäœæããå¿ èŠããããŸããããã¯ãã·ã§ã«ãšã¹ã¯ãªããèšèªã«ãšã£ãŠæ·±å»ãªåé¡ã§ãã PowerShellã¯ã1ã€ã®ã¹ã¯ãªããå ã®ããžãã¯ãšã®ãã¹ãŠã®éããä¹ãè¶ããã®ã«ååãªåçã§ãããšæ³å®ãããŠããŸãããæ§æã¯ã亀æžã®äœå°ãªãéçãªãã®ã®1ã€ã§ãã ãŸããååŸã®äž¡æ¹ãæå¹ãªå Žåã«æ§æãå€æŽããããšã¯ç¹ã«æ害ã§ãããããæ€åºããç°¡åãªæ¹æ³ããªããããèŠåã¯ãªããäž¡æ¹ã®ç°å¢ã§å®è¡ããåŸã§ãããŠãŒã¶ãŒã¯ç°ãªãåäœãçºçããããšãç¥ããªãå¯èœæ§ããããŸãã
äžè¬ã«ããã®ãããªå€æŽã¯éåžžã«åé¡ã«ãªãå¯èœæ§ããããé·æãçæãäžåã£ãŠããå Žåã«ã®ã¿è¡ãå¿ èŠããããŸããéèŠãªèŠçŽ ã¯ãæ¢åã®ã³ãŒããã©ãã ãå£ããŠãããã§ãã
ç°ãªãããŒãžã§ã³ã«å¯ŸããŠæ©èœããã¹ã¯ãªããã®æ°ãæžãããŸã
ã€ãŸãããŠãŒã¶ãŒã¯2ã€ã®ã¹ã¯ãªãããäœæããå¿ èŠããããŸã
ããã§ã¯_new_æ§ææ©èœïŒ ?.
ïŒã«ã€ããŠè©±ããŠããã®ã§ãå®çŸ©äžãããã䜿çšããã¹ã¯ãªããã¯å€ãããŒãžã§ã³ã§ã¯å®è¡ã§ããŸããïŒã€ãŸãïŒãã¬ã¬ã·ãŒããŒãžã§ã³äºæã®ã³ãŒããã¹ãæäŸããæ¡ä»¶ãç¹ã«è¿œå ããªãéããããããããã ãã®äŸ¡å€ã¯ã»ãšãã©ãªãããã§ããããããã°ãã¬ã¬ã·ãŒæ©èœã䜿ãç¶ããããšãã§ããŸãã
ã¯ããå€æ°åãšããŠ$var?
ã䜿çšããŠããå€ãã¹ã¯ãªããã®$var?.foo
ã®è§£éã¯å£ããŸããã次ã®ããã«ãªããŸãã
?
ã¯ã {...}
å²ãããšãªããèå¥åã®äžéšãšããŠèš±å¯ãããã¹ãã§ã¯ãããŸããã§ããã
ããããããšãã§ããã®ã¯äºæ³å€ã§ãããããããå€ãã®äººã«ãšã£ãŠã¯_äžæ_ã§ãããããå人çãªçµéšããèšãã°ããã®ãããªå€æ°åã¯å®éã«ã¯éåžžã«ãŸãã§ããã @ mburszleyã®åæã¯ããå ·äœçãªèšŒæ ãæäŸããŸãã
?
ïŒããã³!
ïŒã®ã¿ãèš±å¯ãã_method_èå¥åã®ã¿ãèš±å¯ããŸããã»ãšãã©ã®RubyãŠãŒã¶ãŒã¯ãä»ã®èšèªããµããŒãããŠãããšæ³å®ããŠã¯ãªããªãããšãèªèããŠãããšæããŸããåãããšãã ãããå®çšçã«èšãã°ïŒ
æ¢åã®ã³ãŒãã®å€§éšåã¯åœ±é¿ãåããŸãã- $var?.foo
ãªã©ã®ããŒã¯ã³ã¯åã«æ€åºãããŸããã
æ°ããã»ãã³ãã£ã¯ã¹ã§$var?.foo
ãèšè¿°ããå Žåãããã§ããå€ãããŒãžã§ã³ã§ãããå®è¡ãããšãæå¹ãªå³å¯ã¢ãŒãã«å¿ããŠãïŒæãããªæ¹æ³ã§äžæããã®ã§ã¯ãªãïŒç°ãªãåäœãçºçããå¯èœæ§ããããŸãããšã«ããæå³ãããšããã«ã³ãŒããå®è¡ããããã«å¿
èŠãªæå°ããŒãžã§ã³ãé©çšããŸã_ïŒ #requires -Version
ãã¢ãžã¥ãŒã«ãããã§ã¹ãããŒïŒã
å šäœãšããŠãããã¯ãã±ãã3ã®å€æŽã®æ確ãªã±ãŒã¹ã§ããæè¡çã«ç Žå£çãªå€æŽã§ãããæ¢åã®ã³ãŒããã»ãšãã©ç Žå£ãããå®éã®ã¡ãªãããæäŸããŸãïŒãŸãã¯ãéã«ãäºæããªãåäœã«ããæ°žç¶çãªé çã®çš®ãåé¿ããŸãïŒã
@ mklement0ã¯ã
ããã§ããã@ SteveL-MSFT-ïŒ11379ãåç §ããŠãã ããã
ç§ã¯ããã«ãããã¹ãŠã®äººã«ãããã§åã³ãµããŒãïŒãŸãã¯ããããéãµããŒãïŒã瀺ãããšããå§ãããŸãã
æãåèã«ãªãã³ã¡ã³ã
@rjmholtããã§åæã
?
ã§çµããäžæã®å€æ°ã¯çŽ70åãããããŸãã