Feed on
Posts
Comments

超誰得メモ

Power Queryではeach Expressionが存在して、たびたびExampleに出てくるのですがいまいち使い分けというかどこで使えるのかわかりません
というわけでこのeachが何かについてだけ調べてみましょう

サンプルから考察する
こんな感じでところどころ使われてます

List.Transform({1, 2}, each _ + 1) equals { 2, 3 }

List.Skip({3, 4, 5, -1, 7, 8, 2}, each _ > 0) equals {-1, 7, 8, 2}

Table.MatchesAnyRows(Table.FromRecords ({[A=2],[A=4],[A=5]}), each Number.Mod([A], 2) = 0) equals true

まあ大体見てればわかりますけどTableやListのようにコレクションに対して使うことができそうな感じがしますね
そもそも普通のオブジェクトでfunctionを引数に取る関数がほとんどありませんけど

でもこれを見てもeachがどういうものなのかよくわかりません
listを引数に取る関数とも見えなくもないですし

しかし実際は上の例はこんな感じに書き換えることができます

List.Transform({1, 2}, (_) => _ + 1) equals { 2, 3 }

List.Skip({3, 4, 5, -1, 7, 8, 2}, (_) => _ > 0) equals {-1, 7, 8, 2}

Table.MatchesAnyRows(Table.FromRecords ({[A=2],[A=4],[A=5]}), (_) => Number.Mod(_[A], 2) = 0) equals true

つまるところeachは引数を1つだけ取る関数の略記として使うことができるというだけです
引数名を_で自動で作成してくれます

(_) => と書くところをeachと書くだけ?っていうと引数の型によってはそうなりますが、真の使い道は引数がフィールドへのアクセスを許容する場合です
つまりRecord, List, Tableなどのインデクサやフィールドを持つ型の場合がとても強力です
どうしてかっていうとeachの中では引数名を省略してフィールドにアクセス可能だからです

上のTable.MatchesAnyRowsの例で行くと (_) => Number.Mod(_[A], 2) = 0 というようにフィールド[A]へのアクセスは通常引数名をつけて_[A]というように記述します
しかしeachの場合、引数名は固定のため省略して each Number.Mod([A], 2) = 0 というように記述することが可能となります

このため、どちらかというとTableに対して使う機会が多いと思いますがListの型を事前に把握できる場合は(ほとんどの場合把握できますが) eachと普通のfunctionを使い分けることが可能です

ちなみにeachはただの略記なのでこんな書き方も一応できます

Function.Invoke(each _ + 2, {2}) equals 4

これだとさすがに何も得しない感じですが


というわけで個人的よくわからないexpressionについて書いてました
ifとかも割と最初つかみづらいので基本的な記法が結構わかりづらいです
その辺の支援まったくないですし

コード書こうと思ってたら休みが過ぎていました
しかし週休4日分くらいあるので頑張れば何とかなりそう

この辺で

Comments are closed.