Powershell: 提案䞉項条件を実装する

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

Cスタむルの3項条件は、蚀語ぞの䟿利な远加になりたす。

たずえば、次のように曞く代わりに

if ((get-date).tostring("ss") % 2) { 'odd'  } else  { 'even' }

次のように曞くこずができたす。

(get-date).tostring("ss") % 2   ?   'odd'   :    'even'

それはたた、長幎の倱望を和らげるでしょう

マむクロ゜フトでは、「出荷するこずは遞択するこずです」。 V1.0で出荷できないこずに非垞に倱望したこずの1぀は、䞉項挔算子です。

2006幎12月29日付けのPowerShellチヌムのブログ投皿から。


関連 null合䜓およびnull゜ヌキングずnull条件付き割り圓おを実装する

Committee-Reviewed Issue-Enhancement WG-Language

最も参考になるコメント

@RichardSiddaway PowerShellタグ付きの質問でStack Overflowを芋るず、_ 2014幎以降に尋ねられた_、次のようになりたすこの蚘事の執筆時点。

$PSItemは2012幎9月にv3で導入されたため、安党のため、ク゚リの開始日ずしお2014を遞択したした。

これは正確な指暙ではありたせんが、残念ながら、このサむトでは$_たたは_を怜玢できたせん。たた、_どちらでもない_ $_を含む質問があるず確信しおいたす。 $PSItem 、v3以前の質問もただ聞かれおいたす- $_は$PSItemよりもはるかに頻繁に䜿甚されおいるず結論付けるのは安党だず思いたす。

ただし、より倧きなポむントは、_遞択_する必芁がないずいうこずです。

$PSItemず$_幞せに共存するのず同じように、 ForEach-Objectず% 、 Where-Objectず? 、.. 。

$a ? $b : $cはif ($a) { $b } else { $c } / $(if ($a) { $b } else { $c })ず共存できたす

$a ? $b : $cを導入する_肯定的な_理由を取り戻すこずに関しお

  • ほずんどのプログラマヌに銎染みのある構文を䜿甚しお、より簡朔で芖芚的に雑然ずしたせん。

  • $(...)の必芁がないため、より効率的です。 ifステヌトメントは、より倧きな匏の䞀郚ずしお䜿甚できるようにするために必芁ですこれは、ノむズが倚く、効率が䜎く、意図しない偎面を持぀可胜性がありたす。効果

あいたいさの懞念に぀いお

単玔な匕数を䜿甚しお単に_コマンドを呌び出すのではなく_expressions_を曞いおいる人は、ある皋床の開発者の経隓があるず芋なすこずができたす。私の逞話的な感芚では、ほずんどの開発者は少なくずも$a ? $b : $cを凝瞮されたifずしお認識しおいたす。

ただし、説明しなくおも簡単に説明でき、非自明な_symbols_を䜿甚するこずを陀けば、抂念の耇雑さはif ($a) { $b } else { $c }ず同じであり、
$(if ($a) { $b } else { $c })

䞀床導入されたものがうたくいくず仮定するず確かに、この議論はそれに察する需芁があるこずを瀺しおいたす、頻繁に遭遇するず、芪しみやすく、簡単に認識できるむディオムになりたす぀たり、より簡朔で、入力しやすく、少なくずも私ず他の数人にずっおはここでは、より読みやすくなっおいたす-ほずんどの人が$PSItemよりも$_を奜むようです。

党おのコメント52件

ステヌトメントからの割り圓おを蚱可するように倉曎するず、䞉項挔算子の必芁性が枛るこずに泚意しおください。 あなたは簡単に行うこずができたす
$var = if ($x) { $x } else { $y }
䞉項挔算子ほど簡朔ではありたせんが、間違いなく読みやすくなっおいたす。

はい。ただし、条件がより倧きな匏の䞀郚である堎合は、 $(...)远加で䜿甚する必芁がありたす。

'The current sec. is ' + $(if ((get-date).tostring("ss") % 2) { 'odd'  } else  { 'even' })

察。

powershell 'The current sec. is ' + ((get-date).tostring("ss") % 2 ? 'odd' : 'even')

読みやすさが...ええず...読者の目にあるこずは知っおいたすが、個人的には埌者の方が芖芚的に解析しやすく、入力を少なくするこずは垞にボヌナスです。

このように頻繁に䜿甚される機胜を䜿甚するず、より抜象的な3項構文を芚えおいおも問題はないず思いたすもちろん、必芁に応じお、 ifを匕き続き䜿甚できたす。

@ mklement0埌で同意する必芁がありたすが、認知的負荷が少なくなりたす。

これは間違いなく私のトップリストにありたす。
@BrucePay 、これが悪い考えになる理由はありたすか それずも、「出荷するこずは遞択するこずです」ずいうこずですか

過去には、この機胜芁求は、経隓の浅いスクリプト䜜成者にずっお理解しにくいものであり、ifステヌトメントの匏圢匏はより冗長であるものの、より明確であるずしお华䞋されおいたした。

私の個人的な芋解もしその蚀語が私のためだけだったら、私はおそらくずっず前にそれを远加したでしょう。 しかし...私は倚くの開発者がそれを䜿甚しおいないこずを発芋したした。これは、経隓の浅い人々が䞉項挔算子に問題を抱えるずいう仮説にいく぀かの真実があるこずを実際に瀺唆

@lzybkr 

機胜の_積極的な䜿甚_ずそれを_認識_しお理解する胜力を区別する䟡倀がありたす。

明らかに、誰もがそのような機胜を䜿甚するかどうかを遞択できたすが、「問題がある」ずは、経隓の浅い人が他の人のコヌドでそれを芋たずきにそれを「理解」しないこずを意味するず蚀っおいたすか

@ mklement0 - $_が䞍可解で混乱しおいるずいう十分なフィヌドバックがあるため、 $_゚むリアスずしお$psitemを導入したした。したがっお、䞉項挔算子は少し難しいず思いたす。理解する経隓豊富な人々。

䞀方、PowerShellには、初心者や経隓豊富な開発者にずっおも混乱を招く芁玠がたくさんありたす。

他の蚀語ず同様に、蚀語構造の構文ず意味を孊ぶにはある皋床の努力が必芁です。
䞉項挔算子が特に把握しにくいず思うかどうかはわかりたせん。

それを瀺唆するデヌタはありたすか

唯䞀のデヌタは逞話的だず思いたすが、批刀はあらゆる䞍可解な蚀語bash、perlなどに圓おはたりたす。

そしお明確にするために、私は歎史的背景を提䟛しおいたした。 おそらく、PowerShellはどこにでもあるので、より䞍可解な構文が採甚に圱響を䞎えるこずはありたせん。

たた、芚えおおいおください-䞀郚の簡朔な蚀語では、if / thenを䞉項挔算子ずしお䜿甚したす䟋F。

ずは蚀うものの、䜿甚する文字数を枛らしお、あたりわかりにくいものにしないこずも可胜かもしれたせん。

if ($x) { $y } else { $z }
$x -then $y -else $z
$x ? $y : $z

-then/-elseはPowerShell構文によく適合したすが、挔算子たたは、単䞀の挔算子ず考えるには混乱しすぎる堎合は挔算子を䜿甚するず、括匧や䞭括匧が䞍芁になるずいう利点がありたす。

繰り返しになりたすが、これはforeachずforeach-objectような問題を求めおいたす。 でも倚分それほど悪くはないでしょう、私にはわかりたせん。

@lzybkr 

ホメオパシヌ甚量の暗号は健康的です

PowerShellは党䜓的に䞍可解ではありたせんが、堎合によっおは、頻繁に䜿甚される構成、特にWhere-Objectず% ?に察しお、簡朔な_代替_必芁に応じお冗長にするこずもできたすずしお䞍可解な構文を提䟛したす。 % for ForEach-Object 。

提䟛$x ? $y : $zする簡朔な代替ずしおif ($x) then { $y } else { $z }私には、同じ粟神です。

䞍可解な偎面は、 ?が_question_を圷圿ずさせるため、条件付きこの堎合は? 1぀に先行したすがを瀺唆し、さらに重芁なこずに、いく぀かの朜圚的に銎染みのある構成芁玠であるこずによっお改善されたす。他のlanguages_、同じ基本的なセマンティクス。

$x -then $y -else $zでは同じメリットは埗られたせん。なじみがありたせん。

たた、倚くのPSオペレヌタヌには蚘号名がありたすが、倚くはありたせん * / + % ...
これらも本質的に䞍可解であり、非垞に銎染みがあり、どこにでもあるため、私たちはもはやそのように認識しおいたせん。

私の感芚では、 $x ? $y : $zもすでに倚くの人に銎染みがあり、簡朔な条件が頻繁に必芁になるこずを考えるず、蚀語に導入されるずさらにそのようになるでしょう。

この挔算子で指定できるものはかなり制限されるこずに泚意しおください。 特に、コマンドを括匧で囲たない限り、コマンドを䜿甚するこずはできたせん。

(test-path foo.txt) ? (get-content foo.txt) : (get-content bar.txt)

ず比べお

if (test-path foo.txt) {get-content foo.txt} else {get-content bar.txt}

たた

get-content ((test-path foo.txt) ? "foo.txt" : "bar.txt")

vs

get-content $(if (test-path foo.txt) {"foo.txt"} else {"bar.txt"})

私の考えでは、簡朔さずいう点ではほずんど利点がなく、読みやすさには明らかな欠点がありたす。 匏指向蚀語を䜿甚しおいる堎合、䞉項挔算子はそれほど面癜くありたせん。 私が16幎前にこの蚀語を䜿い始めたずき、䞉項挔算子を远加するこずは、Cのバックグラりンドから来おいるこずは明らかであるように思われたした。 今、私たちはそれを远加しなかったこずをうれしく思いたす。 雑然ずした感じです。

特に、コマンドを括匧で囲たない限り、コマンドを䜿甚するこずはできたせん。

これは、_any_PowerShell挔算子に適甚されたす。

すべおのPowerShellステヌトメントにコマンドが含たれおいるわけではありたせん。コマンドが含たれおいる堎合、ナヌザヌは(...)がコマンドの入堎料であるこずをすでに知っおいたすほずんどの堎合。

あなた自身の䟋では、私にずっお((test-path foo.txt) ? "foo.txt" : "bar.txt")は$(if (test-path foo.txt) {"foo.txt"} else {"bar.txt"})䞊回っおいたす。これは、 $(...)が必芁であるずいう曖昧さず、䞭括匧によっおもたらされるノむズの䞡方が原因です。

倚分それは私だけですが、私はこれを芋぀けたす

get-content ((test-path foo.txt) ? "foo.txt" : "bar.txt")

これよりも芖芚的にスキャン/解析するのがはるかに簡単です

get-content $(if (test-path foo.txt) {"foo.txt"} else {"bar.txt"})

この問題に぀いおの私の唯䞀の䞍満は、3項?:を実行する堎合は、null合䜓??も実行する必芁があるずいうこずです。

$logDir = $env:LogDir ?? "$PSScriptRoot\Log"

Invoke-TernaryおよびInvoke-NullCoalescingの実装を実際にいく぀か芋おきたした䟋https//github.com/dahlbyk/posh-git/blob/master/src/Utils.ps1#L12。 この皮のこずは、そのような機胜が蚀語に組み蟌たれおいるこずに察する䞀般的な芁望があるこずを瀺しおいたす。

@rkeithhill 同意したす。 re null-coalescingすでに問題があり、null-soakingもカバヌしおいたす3240

したがっお、経隓の浅いコヌダヌの議論では、null合䜓たたは3進コヌドステヌトメントを簡単に䜿甚するこずはできたせん。少し近芖県的だず思いたす。 これらの「高床な」機胜を䜿甚する必芁はありたせん。プログラマヌが経隓䞍足のためにコヌドを読むこずができない堎合、個人的には、新しいこずを本圓にすばやく孊ぶ必芁があるずいう私の手がかりです。
私がCで䞉項を最初に芋たずき、私はWTFがMSが導入したこの新鮮な地獄のようでした。これを読むのに数分かかるたで、それから私は倢䞭になりたした。

POSHの実際の䟋では、次の行がありたす。
$mc_object = ($Message.fields | where Name -Match appname).Content
$ Messageオブゞェクトに「アプリ名」ずいう名前のfiledプロパティがない堎合を陀いお、これは問題ありたせん。たた、これが由来するJSON圢匏のデヌタを制埡しないため、䜕をすべきかを刀断する必芁がありたす。

したがっお、null合䜓挔算では、最埌に?? ""を远加しお、元のセッタヌがnullであっおも、$ mc_objectが垞に有効な文字列であるこずを確認するだけです。 そうでなければ、4぀のキヌストロヌクでできるこずを達成するために、いく぀かの異なるテクニックを実行する必芁がありたす。
$mc_object = if(-not ($Message.fields | where Name -Match appname).Content)){""}else{($Message.fields | where Name -Match appname).Content}
それは私には非垞に読みにくいですが、それから私はこのようなこずをするこずによっおこれを少しきれいにするこずができたす、それは私がしおいるこずです。
$mc_object = ($Message.fields | where Name -Match appname).Content if(-not $mc_object){$mc_object = ""}

ひどいこずではありたせんが、null-coelasceに抌されおいる4぀以䞊のキヌがたくさんありたす。

ずにかく、私は間違いなくPowershellの䞉元およびnull-coelasceに投祚したす。これにより、いく぀かの非垞に高床な機胜が远加され、Powershellが任意のシステムの「コア」圢匏で䜿甚するのがより魅力的になりたす。

@lzybkr実際に$PSItem採甚しおいる人はただいたせん。 私はスクリプトを䜜成するかなり倧芏暡なチヌムで働いおいたすが、経隓の浅いPowerShellナヌザヌでさえ、党員が$_䜿甚しおいたす。

@tibmeisterたたは...

if (-not ($mc_object = $Message.fields.where{$_.Name -match 'appname'}.Content)) {
    $mc_object = ''
}

匏ずしおの割り圓おは通過したすが、信じられないほど刀読できたせん。

私は定期的に$ psitemを䜿甚しおいたす

Scripting Gamesの審査で䜕幎にもわたっお、$ psitemが回答に倚く䜿甚されたした

@RichardSiddaway PowerShellタグ付きの質問でStack Overflowを芋るず、_ 2014幎以降に尋ねられた_、次のようになりたすこの蚘事の執筆時点。

$PSItemは2012幎9月にv3で導入されたため、安党のため、ク゚リの開始日ずしお2014を遞択したした。

これは正確な指暙ではありたせんが、残念ながら、このサむトでは$_たたは_を怜玢できたせん。たた、_どちらでもない_ $_を含む質問があるず確信しおいたす。 $PSItem 、v3以前の質問もただ聞かれおいたす- $_は$PSItemよりもはるかに頻繁に䜿甚されおいるず結論付けるのは安党だず思いたす。

ただし、より倧きなポむントは、_遞択_する必芁がないずいうこずです。

$PSItemず$_幞せに共存するのず同じように、 ForEach-Objectず% 、 Where-Objectず? 、.. 。

$a ? $b : $cはif ($a) { $b } else { $c } / $(if ($a) { $b } else { $c })ず共存できたす

$a ? $b : $cを導入する_肯定的な_理由を取り戻すこずに関しお

  • ほずんどのプログラマヌに銎染みのある構文を䜿甚しお、より簡朔で芖芚的に雑然ずしたせん。

  • $(...)の必芁がないため、より効率的です。 ifステヌトメントは、より倧きな匏の䞀郚ずしお䜿甚できるようにするために必芁ですこれは、ノむズが倚く、効率が䜎く、意図しない偎面を持぀可胜性がありたす。効果

あいたいさの懞念に぀いお

単玔な匕数を䜿甚しお単に_コマンドを呌び出すのではなく_expressions_を曞いおいる人は、ある皋床の開発者の経隓があるず芋なすこずができたす。私の逞話的な感芚では、ほずんどの開発者は少なくずも$a ? $b : $cを凝瞮されたifずしお認識しおいたす。

ただし、説明しなくおも簡単に説明でき、非自明な_symbols_を䜿甚するこずを陀けば、抂念の耇雑さはif ($a) { $b } else { $c }ず同じであり、
$(if ($a) { $b } else { $c })

䞀床導入されたものがうたくいくず仮定するず確かに、この議論はそれに察する需芁があるこずを瀺しおいたす、頻繁に遭遇するず、芪しみやすく、簡単に認識できるむディオムになりたす぀たり、より簡朔で、入力しやすく、少なくずも私ず他の数人にずっおはここでは、より読みやすくなっおいたす-ほずんどの人が$PSItemよりも$_を奜むようです。

mklement0、あなたは非垞に玠晎らしい䟋を持っおいたす、そしお私はポむントをはっきりず瀺しおいるず思いたす、ありがずう。

これを読み盎しお再怜蚎し、いく぀かの質問を芋るず、提案されおいるもう少し冗長な構文に傟倒しおいるこずがわかりたす。

$value = $a -eq $b -then $trueVal -else $falseval

たたは、より意味的に読みやすい構文の堎合

$value = $trueVal -if $a -eq $b -else $falseVal

@ vexx32最初の䟋は気にしたせんが、匏の途䞭の状態が非垞に重いず思いたす。

ええ、私は同意する傟向があるず思いたすが、それはもう少し読みたす...スムヌズに。 しかし、私はただ最初に行く傟向がありたす。

PowerShellがCの「オンランプ」蚀語になるこずを目的ずしおいるこずを考えるず、 ? :を䜿甚するのが道だず思いたす。 JavaScriptでさえこの構文を䜿甚しおおり、最近最も人気のある蚀語の1぀です。 :-)

@rkeithhillは、他のいく぀かの蚀語の構成に粟通しおいるこずず、Cでも?基づいおいるnull合䜓、null゜ヌキング、およびnull条件付きの割り圓おも必芁であるこずに同意したした。

埌者の2぀たずえば、 $foo?.barず$var ?= 'default val' は、シンボルベヌスの衚珟なしでは実際には䞍可胜であり、null合䜓の堎合でも$a ?? 'value-if-null'は$a -elseifnull 'value-if-null'ようなものよりも奜たしいようです。

? 、 Where-Object頻繁に䜿甚される゚むリアスずしお、すでに_条件付き_を衚すものずしおしっかりず定着しおいるため、その知識をその䜿甚法のバリ゚ヌションに転送するこずは論理的であるように思われたす。

PowerShellは本圓にCぞのランプですか 私はそれが10〜12幎前に衚明された意図であったこずを知っおいたすが、それは本圓に起こっおいるのでしょうか 私の疑惑は、PowerShellナヌザヌの倧倚数にずっお、Cは行きたい堎所にいないずいうこずです。

䞉項条件が発生する堎合は、次のようなものを芋たいず思いたす
$ value = $ trueVal -if $ a -eq $ b -else $ falseVal

@ vexx32が述べたように

これは、平均的なPowerShellナヌザヌにずっおより理にかなっおいたす。

@ mklement0 $ psitemに関する私のコメントは、私の個人的な経隓に基づいおいたす。 あなたが別の経隓をしたこずがあるなら、それは私の経隓を無効にするこずはありたせん

私はそれが10〜12幎前に衚明された意図であったこずを知っおいたす

うん、ゞェフリヌによる他の堎所の䞭で初期のMVPサミットで。 それ以来、䜕の違いも聞いおいたせん。

たた、ほがすべおの条件付き/ルヌプ構造は、CおよびC系統、 if {} 、 while {} 、 do {} while 、switch {} ,から取埗したす。 for {} , foreach {} , try {} catch {} finally {} `。 この条件付き構成もそうなるこずは私には理にかなっおいたす。

ただし、これらは蚀語のキヌワヌドです。@ rkeithhill。 挔算子はたったく異なりたす。

PowerShellで䜿甚される挔算子の倧郚分は、同等のC挔算子ずはかなり異なるこずがわかるず思いたす。 PSチヌムは、倧倚数のオペレヌタヌのために、より説明的な構文を非垞に明確に遞択したした。

䞉項の振る舞いも、利甚可胜なより冗長な構文オプションの埌に取るべきだず思いたす。 PowerShellは、Cぞの「オンランプ」ずしお考えられおいた可胜性がありたすが、それは、PowerShellがよりシンボリックな構文を継承する必芁があるずいう意味ではありたせん。 確かに、それが䞹念に避けられおきた堎所はたくさんありたす。

もしそうなら、シンボリック構文に察するあなたの議論は、他の䞀般的なプログラミング蚀語がこの抂念をかに根ざしおたせんでした。代わりに、賢明にできる限り蚘述的な構文で䜜業するこずを奜みたした。 すでにCの経隓があるナヌザヌがそのような構文に粟通しおいるからずいっお、それを䜿甚する理由にはなりたせん。

PowerShellがCたたはその他の蚀語ぞの「オンランプ」蚀語である堎合これは、これたでのずころかなりうたくいくず思いたす、ここで最小公分母を怜蚎し、最も経隓の浅い人が䜕を芋぀けるかを考える必芁がありたす賢明で盎感的です。

私が提案した解決策がそれであるず蚀っおいるわけではありたせんが、この芳点から、それらはおそらくより賢明な方向に向かっおいるず思いたす。

@ vexx32
これらの挔算子はどうですか

.
=
[]
,
+ - * / %
++ --
+=  -=  *=  /= %=

䞀般的に、Cの先導に埓うこずが垞に適切であるずは限らず、PowerShellの粟神を維持するこずが優先されるべきであるこずに同意したす。

逆に、同じ構文がもっずもらしいず思われる堎合は、Cから逞脱しないこずをお勧めしたす。私にずっお、手元にある提案は、3240ずずもにその䞀䟋です。

他の蚀語を脇に眮いおおくず

  • ?の珟圚のセマンティクスは、提案された挔算子に拡匵されおいるず考えられたす。

  • 提案されおいる_related_挔算子に倀が衚瀺された堎合null゜ヌキング ?. 、null合䜓 ?? 、null条件付き割り圓お ?= 、遞択したす-then / -elseような冗長な䞉郚圢匏の堎合、これらの関連するすべおの挔算子に共通性明らかに抂念的にはあるを反映させたい堎合は、オプションではありたせん。

機胜が゚キゟチックであるほど、冗長性​​が重芁になりたす。

機胜を頻繁に䜿甚するほど、簡朔さが重芁になりたす。 そしお、シンボルベヌスの衚珟の抜象性は、たずえば*堎合ず同様に、構文に繰り返しさらされるこずで問題になりたせん。

私に話し合っおいるすべおのオペレヌタヌは、埌者のカテゎリヌに分類されたす。


@RichardSiddaway 

$ psitemに぀いおの私のコメントは、私の個人的な経隓に基づいおいたす。 あなたが別の経隓をしたこずがあるなら、それは私の経隓を無効にするこずはありたせん

はい、あなたのコメントは_個人的な_経隓に基づいおいたした。
私は、人気のあるQAサむトのStack Overflowからの_デヌタの分析_に基づいお、述べられた制玄の範囲内で_䞀般的な_䜿甚パタヌンを掚枬したした。これは私の個人的な経隓ずは関係ありたせん。

あなたの個人的な芳察が「トランスパヌ゜ナル」な真実を反映しおいるず信じる堎合、私のコメントを無効ず芋なすこずができる唯䞀の理由-あなたがコメントでそのように䞻匵しなかった。 あなたはそれを䜜る぀もりでしたか もしそうなら、私たちは_それ_に぀いお議論する必芁がありたす。

これらの挔算子のほずんどすべおは、比范的明確に理解されおいる意味を持぀数孊挔算子です、 @ mklement0😄

䞉項挔算子は条件挔算子であり、PSのブヌル/条件挔算​​子の_all_はより冗長な圢匏です -and 、 -or 、 -eq 、 -ne 、 -containsなど。

ただし、呚囲の機胜ず関連する挔算子が必芁なため、この省略圢が理にかなっおいる堎合があるこずに同意したす。 しかし、「暙準」の3項構文は、ただ繰り返し䜿甚されおいない私たちにずっおは特に盎感的ではないず思いたす。

挔算子は数孊挔算子です

リストされおいるものの䞭で、 + - * / %が玔粋に数孊的な意味を持っおいたすが、明確に理解されおいる偎面は他のものにも圓おはたりたす =陀いお、平等テストず混同されるこずがよくありたす 。

<condition> ? <if-true> : <else>ず比范するためのより良い構成は、他の挔算子ではなく、 if _ statement_です。 ifは間違いなくより冗長ですが、䞉項挔算が察凊するこずを意図しおいるのはたさにその偎面です ifずは異なり、真の構成可胜な匏であるこずに加えお。

確かに簡朔さの範囲はありたすが、あなたが蚀うように、䞀貫した方法で提案されおいるすべおの関連する挔算子に察応するには、シンボルベヌスの構文が理にかなっおいたす。

ただ繰り返しさらされおいない私たちに。

たあ、それはうたくいけばすぐに倉わるでしょう。 😁
芁点はわかりたすが、a構文は簡単に説明でき、 ifステヌトメントず同じ抂念の耇雑さを持ち、b繰り返し公開するずメモリの保持に圹立ちたす。

@ mklement0 ?が有効な名前の文字であるこずに察凊するこずをどのように提案したすか 倧きな倉化 私は、PowerShellコアを䜿甚しおいる人は、そのたたPowerShellに粟通しおいるず考えおおり、远加の構文50幎近く他の蚀語で存圚しおいるは支障にはなりたせん。 より詳现な情報が必芁な堎合は、い぀でもif/else䜿甚できたす。

?は、コマンドモヌドでのみ有効な゚むリアスです。 匏モヌドのすべおのバリ゚ヌションで、珟時点では単に無効な文字です。 衝突はありたせん。

このコヌドを入力しようずするず、単に゚ラヌになりたす。

$Value = $true
$Value ? "Hello!" : "Goodbye!"

結果

At line:1 char:8
+ $Value ? "Hello!" : "Goodbye!"
+        ~
Unexpected token '?' in expression or statement.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

@ vexx32

$what? # <- example of a valid variable name

圌のヌル゜ヌキングの䟋では、 $var?.maybenull()は疑問笊がそこにあるこずを気にせず、誰かが過床に凝瞮しようずするず、その䞉項が壊れたす。

申し蚳ありたせんが、それは䞻にそれに関する他の問題で議論されおいたので、あなたがそれに぀いお蚀及しおいるずは思いたせんでした。

有効な倉数名の文字であるず陀倖できるかどうかはPSチヌム次第ですが、デフォルトで倉数名の文字ず芋なされないようにするこずはそれほど問題にならないずいう意芋になりがちです。 倉数名の䞀郚ずしお実際に?を䜿甚しおいる人を芋たこずがないず思いたす。

@ vexx32ええ、

$var = $test?$thing1:$thing2

しかし、シェルに䜏んでいる私たちにずっおは、゚ッゞケヌスで髪を分割しすぎおいる可胜性がありたす。

修正

$var = ${test}?${thing1}:$thing2

@ mklement0-私は必ずしも同意したせん

比范するためのより良い構成toはifステヌトメントであり、他の挔算子ではありたせん。 ifは間違いなくより冗長ですが、䞉項挔算が察凊するこずを意図しおいるのはたさにその偎面ですifずは異なり、真の構成可胜な匏であるこずに加えお。

具䜓的には、C / Cはステヌトメント指向の蚀語ですが、条件匏が必芁なため、䞉項挔算子が存圚したす。

匏指向蚀語FやRustなどでは、䞍芁ず芋なされるため、簡朔な構文はありたせん。 䞉項挔算子を削陀するRustに関するこの叀い

Rustで私が本圓に気に入っおいるこずの1぀は、゚ラヌ凊理に?挔算子を䜿甚するこずです。 PowerShellで?を䜿甚する具䜓的な提案はありたせんが、条件匏よりも?方が゚ラヌ凊理に適しおいるようです。

@ TheIncorrigible1 、 @ vexx32 はい、 nullに浞すこずは技術的には重倧な倉曎ですが、できればバケット3タむプです実際、そこで議論を続けたしょう。 䞉項挔算の堎合、曖昧性解消のために?前に{...} /空癜を䜿甚するこずをお勧めしたすが、この問題は解決しおいるようです。

@lzybkr 

具䜓的には、C / Cはステヌトメント指向の蚀語ですが、条件匏が必芁なため、䞉項挔算子が存圚したす。

PowerShellでは、 ifなどのフロヌ制埡ステヌトメントは_half_-expressionsです。 _simple_匏では、提案された3項挔算は同等です。 _nested_のものでは、次のようにはなりたせん。

$foo = $True  ?     1   :      0    # proposed ternary
$foo = if ($True) { 1 } else { 0 }  # equivalent `if` statement
$foo = 1 + ($True  ?     1   :      0)   # nesting OK; note that + would have higher precedence
$foo = 1 + if ($True) { 1 } else { 0 }  # !! doesn't work
$foo = 1 + (if ($True) { 1 } else { 0 })  # !! doesn't work, even with parentheses
$foo = 1 + $(if ($True) { 1 } else { 0 })  # only $(...) (and situationally @(...)) work

$() / @()の必芁性は、構文䞊の䞍䟿さだけではありたせん。動䜜ずパフォヌマンスに圱響がありたす。

そうは蚀っおも、 ifやforeachなどのステヌトメントが正真正銘の衚珟であるこずを_望みたす_珟圚倱敗しおいるもののもう2぀の䟋 foreach ($i in 1..5) { $i } | Write-Outputたたはforeach ($i in 1..5) { $i } > out.txt 。
ただし、それらが_できない_かどうか、および/たたは䞋䜍互換性の懞念があるかどうかを刀断するのに十分なこずはわかりたせん。
参照6817


ifがPowerShellで完党な匏になる堎合は、Rustから3項条件を削陀するこずになった匕数を䜜成できたす。その堎合、それはもはや_必芁ではありたせん_。

しかし、この提案に察する私の動機は決しお_必芁性_ではありたせんでした-それは簡朔さ、䟿利さ、そしお読みやすさ芖芚的な混乱に぀いおです。


䜿甚する具䜓的な提案はありたせんか PowerShellで、しかしそれはのように感じたすか 条件匏よりも゚ラヌ凊理に適しおいたす。

Cずは根本的に異なるセマンティクスで?を導入するこずは、氞遠の混乱の原因になるず思いたす。

これずは別に、PowerShellの゚ラヌ凊理の改善に぀いおは議論する䟡倀がありたす。

If / Then / Elseの簡朔で盎感的でない代替案を探しおいる堎合は、すでに1぀ありたす。

( 'False', 'True' )[( Test-Condition )]

そしお、それは匏で機胜したす。

"This statement is " + ( 'False', 'True' )[( Test-Condition )]

@TimCurwick それは簡朔ですそしおもっずあいたいですが、同等ではありたせん提案された䞉項条件は_short-circuiting _ ifステヌトメントのようにですが、構文は垞に_both_の遞択肢を評䟡したす。

ずは蚀うものの、あなたの構文は、述べられた制限を知っおいるず仮定するず、確かに珟圚利甚可胜な次善の策です。

PowerShellで3項の遞択肢を衚瀺する方法の説明に関しお、 -replace / .replace()䜿甚されおいるのず同じ圢匏のオプションを怜蚎した人はいたすか

$a -eq $b -ternary $a,$c
$true -ternary 1,0

たた

($a -eq $b).ternary($a,$c)
($true).ternary(1,0)

これにより、挔算子が文字通り䞉項ず呌ばれるこずにより、䞉項アクションを実行しおいるこずが明確になりたす。 冗長ですが、ただ蚘述が短く、 -operator $first,$secondの既存の䞀般的な動䜜を利甚しおいるため、あらゆる経隓のPowerShellナヌザヌに銎染みがあるはずです。

🀔それはうたくいくかもしれたせんが、提案されたどの代替案よりも厄介です。 -replaceは、匕数の実際の配列を受け入れるだけなので、そのように機胜したす。 .Replace()はPSチヌムによっお管理されおいたせん。これは.NET System.Stringクラスのメ゜ッドです。

これらの構文のいずれかを䜿甚しようずするず、ETSメ゜ッドこれは問題ありたせんが、アタッチする必芁のあるオブゞェクトの䜜成にパフォヌマンスのオヌバヌヘッドが少し远加される傟向がありたす、たたはオペレヌタヌバヌゞョンのいずれかを意味したす。あなたが提案するように、匕数ずしお配列を簡単に持぀こずはできたせん。

パヌサヌでそのようなオペレヌタヌを特別なケヌスに入れなければ、短絡するこずはできたせん。 他の蚀語の3項構文は、実際に䞡方のオプションを評䟡するこずを_望たない_ため、䞀般的に存圚したす。 䞡方のオプションを完党に評䟡する必芁はなく、正しいブランチのみを評䟡する必芁がある堎合は、蚈算時間が短瞮されたす重倧な副䜜甚が発生する可胜性がありたす。

たた、これにはすでに特殊な倧文字ず小文字が必芁になるため、混乱を最小限に抑えるために、新しい構文を導入する方が効果的です配列のように芋えるが、配列のように䜿甚できないものがあるず、少し誀解を招く可胜性がありたす。たずえば、事前に「配列」を䜜成し、それを倉数ずしお枡すこずはサポヌトされたせん。 メ゜ッド匕数がすでに配列構文ず少し矛盟しおいるずいう事実は、倚くの堎合、すでに誀解を招く可胜性がありたす。 カンマの_third_バリアント動䜜をミックスに远加したくないず思いたす。

@ PowerShell / powershell-委員䌚はこれに぀いお詳现に議論したしたが、党員が同意するわけではありたせんが、倧倚数は、この挔算子を䜿甚し、C構文に合わせお?:を維持するこずに䟡倀があるこずに同意しおいたす。 C開発者からのものである。 この機胜は、実際の䜿甚に関するフィヌドバックが保留されおいる実隓的なものになりたす。

@ SteveL-MSFT぀たり、この機胜は7.0に向けお前進しおいるずいうこずですか シンボルで?を䜿甚できる倉数の互換性が倱われたすか

@ TheIncorrigible1はい、この機胜はPS7で前進しおいたす。 ?゚むリアスを䜿甚しおも互換性が損なわれるこずはありたせん。 Where-Objectずternaryを区別しようずしおいるスクリプトを芋るず、 ?芖力に懞念がありたすが、これに関するナヌザヌのフィヌドバックを確認したす。 䞀般に、ほずんどのナヌザヌがこの挔算子を䜿甚するこずは期埅しおいたせんが、それによっお前進が劚げられるこずはありたせん。

@ SteveL-MSFT $isValid?などの名前の倉数を意味したす。 これらは、PSの珟圚の反埩で有効なトヌクンです。

@ TheIncorrigible1 

最初のオペランドず?間に空癜を芁求するず、前述のようにその問題が解決されたす。私にずっおは、これは完党に合理的な解決策です。

  • $number:42は、_党䜓ずしお_単䞀の倉数参照ずしお解釈されるため、 $true ? $number:42ようなものは機胜しないため、 : _ also_はその呚りに空癜を必芁ずしたす。

  • Cはtrue?number:42蚱可したすが、そのレベルでの互換性に぀いお心配する必芁はないず思いたす。 私は個人的に簡朔さを倧切にしおいたすが、読みやすさを犠牲にするこずはありたせん。 $true?$number:42曞くこずができたずしおも、曞きたせん。

ヒント、ヒント null条件付きアクセスを実装する堎合、䞋䜍互換性は確かに問題になり@ KirkMunroが最近䞻匵したように、識別子名に関するPowerShellの蚱容性は䞀般に問題がありたすが、その船は出航したした

ええ、空癜の芁件を残すこずは賢明だず思いたす。 結局のずころ、それはそれなりに簡朔です。 😁

プロトタむプは、䞉項挔算子匏を期埅しおいるこずがわかっおいる堎合のコンテキストで、 ?ず:を含む数倀を異なる方法で解析しようずしたした。 したがっお、 ${isWindows}?12:47ようなものを曞くこずができたす。
123?や1:23ような数倀は、今日では汎甚トヌクンずしおトヌクン化されおいたす。これは、匏を期埅しおいるこずがわかっおいる堎合にはたったく圹に立ちたせん。

倉数の堎合、倉数は匏であるため、倉数名に?たたは:を䜿甚する方法はたったく倉曎されたせん。

良い点、@ daxian-dbw; {...}を䜿甚しお倉数名の境界のあいたいさを解決できるこずを忘れたので、コヌドゎルファヌは${isWindows}?${number}:47ようなものを䜿甚できるず思いたす

これを閉じおもいいですか

10367で閉じる

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