Perl/PPCs/ppcs/ppc0016-indexed-builtin の翻訳
この文書は、Perl/PPCs/ppcs/ppc0016-indexed-builtinを翻訳したものです。
原題は「A built-in for getting index-and-value pairs from a list」です。
A built-in for getting index-and-value pairs from a list
(リストからインデックスと値のペアを取得するビルトイン関数)
Preamble
訳注: こちらは、原文の情報です。
Author: Ricardo Signes <rjbs@semiotic.systems>
Sponsor:
ID: 0016
Status: Implemented
Abstract
この PPC は、不連続なリストの値とそのインデックスのための新しいビルトイン indexed
を
提案します。これは キー/バリュー操作を簡単にします。
Motivation
v5.36.0で n-at-a-time foreach が加わりました。簡単にリストのインデックス/バリューの ペアを取得できるようになり、ペアでイテレーションすることも簡単になりました。
Rationale
もし、インデックスとバリューをイテレーションする場面ではこう書きます:
for my ($i, $value) (%array[ keys @array ]) {
say "$i == $value";
}
これは悪くありませんが、ちょっと冗長です。もし対象の array が構造上深いとこうします:
for my ($i, $value) ($alpha->{beta}->[0]->%[ keys $alpha->{beta}->[0]->@* ]) {
say "$i == $value";
}
これはよくないですね。
indexed
があればこう書きます。
for my ($i, $value) (indexed $alpha->{beta}->[0]->@*) {
say "$i == $value";
}
これはたぶんたくさんのものをPerlに追加しなくてもできるほど簡単かもしれない。
Specification
indexed LIST
indexed
はリストを引数にします。
スカラーコンテキストでは indexed
は引数のリストのエントリー数を返します。keys
や values
と
似ています。これはあたらしい "scalar" カテゴリーで warning されません。
Useless use of indexed in scalar context
無効コンテキストでは、Useless use of %s in void context
というワーニングが
出ます。
リストコンテキストでは、indexed LIST
は2倍の長さのリストとして、ゼロからはじまる
整数値と合わせて評価されます。全ての値はコピーです。values ARRAY
と違います。
(もし LISTが確かに array なら、arrayを変更するためにこのインデックスが使えます!)
(翻訳注: values ARRAY
はコピーではなく実体が返るので、LISTの値を変更するなら
values ARRAY
で取り出した値を変更すれば良いということ。indexed LIST
はコピーが返る)
Backwards Compatibility
後方互換性に関してこれといった懸念はありません。indexed
はリクエストされたときのみ
インポートされます。静的解析ツールは更新が必要になります。
古い Perl で indexed を使えるようにする機能は提供可能ですが、最適ではないでしょう。
Security Implications
特になし
Examples
(Rationale にある例を見てください。)
keys
と values
のドキュメントにも indexed
を参照するように更新されることを
期待します。また、for
のドキュメントにもノートを追加します。
n-at-a-time foreach が実験段階でなくなるとき、each
のドキュメントで
indexed
による for my (...) (...)
を新しい each
として言及するべきです。
Prototype Implementation
None.
Future Scope
予定通り完了
Rejected Ideas
ハッシュや配列リテラルで keys
と values
を組み合わせて呼ぶような kv
の置き換え。
何も省略しないスライス文の置き換え。
Open Issues
None?
Copyright
Copyright (C) 2021, Ricardo Signes.
This document and code and documentation within it may be used, redistributed and/or modified under the same terms as Perl itself.