Powershell: 提案null合䜓、null条件付きアクセスnull゜ヌキング、null条件付き割り圓おを実装する

䜜成日 2017幎03月02日  Â·  71コメント  Â·  ゜ヌス: PowerShell/PowerShell

ヌル合䜓およびヌル条件付きアクセスヌル゜ヌキングは、蚀語ぞの䟿利な远加です。

_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蚭定で瀺されおいるように、存圚しないむンデックスぞのアクセスに関する既存の動䜜に䟝存したす。


関連䞉項条件を実装する

Issue-Enhancement Resolution-Fixed WG-Language

最も参考になるコメント

@rjmholtここで分析を?で終わる䞀意の倉数は玄70個しかありたせん

党おのコメント71件

@ 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_です。

    • _personal_泚_variable_名のタむプミスを避けるために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に固有の条件付きメンバヌたたはむンデックスアクセス

    • アクセスされおいる倀が_non- $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を参照しお

  • _Null-value_-条件付きアクセス- $obj _itself_は$nullです

構築| -オフ| -バヌゞョン1 | -バヌゞョン2 | -バヌゞョン3以降
---------- | ---- | ---------- | ---------- | ------------
$ obj | 👍| 🚫| 🚫| 🚫
$ obj.Prop | 👍| 👍| 🚫| 🚫
$ obj [42] | 🚫| 🚫| 🚫| 🚫
$ obj.Method| 🚫| 🚫| 🚫| 🚫

-Offず-Version 1では、 $obj.Propが蚱可されおいるのに察し、 $obj[42]は蚱可されおいないのは䞍思議です。

  • _Member-existence_-条件付きアクセス- $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-私の知る限り、 $? $$ず$^は特別な方法で扱われたす。

https://github.com/PowerShell/PowerShell/blob/8b9f4124cea30cfcd52693cb21bcd8100d39a796/src/System.Management.Automation/engine/parser/tokenizer.cs#L3001 -L3004

芁玄するず、これらの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 を理解できたす。 したがっお、これらの経隓の浅いナヌザヌの倉曎を壊さないようにするため、たす。 ただし、最初の箇条曞きに埓っお怜蚌したす。
  • @ daxian-dbwは、スクリプタヌが$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の分析はより具䜓的な蚌拠を提䟛したす。

    • Rubyでさえ、識別子の_end_で? および! のみを蚱可し、_method_識別子のみを蚱可したす。ほずんどのRubyナヌザヌは、他の蚀語がサポヌトしおいるず想定しおはならないこずを認識しおいるず思いたす。同じこず。

だから、実甚的に蚀えば

  • 既存のコヌドの倧郚分は圱響を受けたせん- $var?.fooなどのトヌクンは単に怜出されたせん。

  • 新しいセマンティクスで$var?.fooを蚘述した堎合、そうです。叀いバヌゞョンでそれを実行するず、有効な厳密モヌドに応じお、明らかな方法で䞭断するのではなく異なる動䜜が発生する可胜性がありたす。ずにかく意図したずおりにコヌドを実行するために必芁な最小バヌゞョンを適甚したす_ #requires -Version 、モゞュヌルマニフェストキヌ。

党䜓ずしお、これはバケット3の倉曎の明確なケヌスです。技術的に砎壊的な倉曎であり、既存のコヌドをほずんど砎壊せず、実際のメリットを提䟛したすたたは、逆に、予期しない動䜜による氞続的な頭痛の皮を回避したす。

@ mklement0は、

いいですね、@ SteveL-MSFT-11379を参照しおください。

私はここにいるすべおの人に、そこで再びサポヌトたたはあえぎ、非サポヌトを瀺すこずをお勧めしたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡