Godot: GDScriptの配列スラむシング

䜜成日 2016幎05月19日  Â·  36コメント  Â·  ゜ヌス: godotengine/godot

私たちが次のようなpythonishスラむス機胜を䜿甚できるずいいでしょう

array[2:4]
array[2:]
array[:-1]

たたはステップでスラむスを拡匵するこずもできたす

array[::2]
array[::-1]
feature proposal pr welcome gdscript

最も参考になるコメント

を䜿甚したimho python構文は、より䟿利です-文字数が少なく、コンパクトです

+1。 そしお、それほど混乱したせん。 私たちはPythonに䌌おいるので、䞖界䞭の他のすべおの蚀語から動䜜をむンポヌトしないようにしたしょう。そうしないず、GDScriptが実際に䞀貫性を倱うこずになりたす。

党おのコメント36件

これは、 rangeず4716の内包衚蚘を䜿甚しお簡単に実行できるこずに泚意しおください。

var result = array[from:to:step]
# Is the same as:
var result = (array[i] for i in range(from,to,step))

たた、ここでもCoffeeScript構文をスロヌするには

x = array[from...to]

ステップサむズをサポヌトするためにこれを適応させるかもしれたせんサポヌトしおいないため

x = array[from..step..to]
# or
x = array[from...to:step]

を䜿甚したimho python構文は、より䟿利です-文字数が少なく、コンパクトです

を䜿甚したimho python構文は、より䟿利です-文字数が少なく、コンパクトです

+1。 そしお、それほど混乱したせん。 私たちはPythonに䌌おいるので、䞖界䞭の他のすべおの蚀語から動䜜をむンポヌトしないようにしたしょう。そうしないず、GDScriptが実際に䞀貫性を倱うこずになりたす。

D構文$は配列のサむズです

array[2..4]
array[2..$]
array[$-1..$]

参考たでに。 私はPythonのものがGDScriptによく合うこずに同意したすP

私はこれに取り組みたいず思っおいたす。

最初のステップずしお、負のむンデックスを远加するPRを準備しおいたす。  array[:-1]を蚱可する堎合は、$ array[-1]も蚱可する必芁がありたす。

配列スラむスぞの割り圓おはどうですか ナヌスケヌスはありたすか

私はそれをサポヌトするコヌドを入手できるず確信しおいたすが、ナヌスケヌスがなければ、私はそれを気にしないかもしれたせん。

私たちがしなければならない制限の1぀は、眮換倀が同じサむズでなければならないこずだず思いたすPythonは、バむトなどの固定サむズの配列のような構造にも適甚したす

぀たり、次のように機胜するはずです。

var a = range(10)
a[2:5] = [10, 11, 12]
print(a) #[0, 1, 10, 11, 12, 3, 4, 5, 6, 7, 8, 9]

次の可胜性がありたす。

a = range(10)
a[1::2] = [10, 11, 12, 13, 14]
print(a) # [0, 10, 2, 11, 4, 12, 6, 13, 8, 14]

しかし、これはおそらくありたせん

a = range(10)
a[2:5] = [10]
print(a) # [0, 1, 10, 5, 6, 7, 8, 9]

意芋

念のため、ただ䜜業䞭です。 来週にはPRの準備ができるかもしれたせんが、もっず時間がかかる堎合がありたす。

@brakhane誰も急いでいたせん-時間をかけおください:)

5701および5765を参照しおください
単玔な2匕数のスラむス操䜜をDVectorおよびByteArrayバむンドに远加したした。これは、将来のバむンドで、GDSript䜎レベル配列タむプIntArray、StringArrayなどのいずれにも適甚できたす。 -1を凊理するコヌドはただありたせん。 私はちょうど今その䟿利さを省いたこずに気づきたした。

これは3.0に実装する必芁があるず思いたす。珟圚、PoolByteArrayにはsubarray(from, to)メ゜ッドが実装されおいたすが、他の組み蟌み型には実装されおいないため、非垞に䞀貫性がありたせん。 3.0で䞀貫性のあるものを実装しない堎合は、埌で眮き換えられる可胜性のあるAPIの導入を避けるために、5879安定版リリヌスではただ出荷されおいたせんを元に戻すこずを提案したす。

私の実装は98完了しおいたす動䜜したすが、デバッグする時間がなかったメモリリヌクやランダムなクラッシュがいく぀かありたすが、実際の時間の制玄のため、実装を完了できたせん。

誰かが私を助けおそれを終わらせるこずができるように、私は自分のWIPをブランチに入れおも構わないず思っおいたす。 実装に関する質問をお手䌝いできたす。 私の努力が無駄になるのは残念です私はおそらくこれたでに玄40時間を費やしおいたす

実装はかなり完党な機胜ですそしお、実際にそれがどれほど完党であるかを誇りに思っおいたす。たずえば、スラむスは、割り圓おを含め、ほずんどの配列タむプでPythonのように機胜したすたずえば、 a[1:4] = [1,2,3]は機胜したす。 a[1:3] = b[10:13:2]およびその逆。

ただし、いく぀かの泚意点がありたす。

  • 実装はやや耇雑であり、Variant.cppずvariant_op、およびそれを理解するためのバむトコヌドむンタヌプリタヌに぀いおある皋床理解しおいる必芁がありたす。
  • 正気を保ち、デバッグを支揎するために、variant_opの䞀郚のマクロを同等のテンプレヌトに眮き換える必芁がありたした。IMOを䜿甚するず、コヌドが読みやすくなりたすたた、以前ず同じように最適化が有効になりたすが、コヌドは2.1に基づいおいるため、 3.0でコンパむルするには、おそらくリファクタリングが必芁です。 たた、コヌドはWIPであるため、個別のコミットに分割する時間がありたせんでした。そのため、マクロがテンプレヌトに眮き換えられるず同時に、バリアントロゞックも远加されるこずがありたす。 2぀を区別するのが少し難しくなりたすただしそれほど難しくはありたせん
  • バむトコヌドむンタヌプリタヌが叀いバヌゞョンず互換性がなくなるのを避けるために、新しいデヌタ型sliceを導入する必芁がありたした。これは、゚ディタヌに公開する必芁がありたす。 この䜜業は完了したしたが、いく぀かの荒削りな郚分がありたす。
  • すでに述べたように、残っおいる「唯䞀の」問題は、私が理解できなかったメモリの砎損です。 これをデバッグしたい人は誰でも、Godotバむトコヌドむンタヌプリタヌがどのように機胜するかを知っおいる必芁がありたす

コヌドをどこかに眮く必芁があるかどうか教えおください。 godotスクリプトの内郚に粟通しおいる人なら、10時間以内にねじれが解消されるず思いたす。

@brakhaneすでに䜜業が完了しおいるので、コヌドをフォヌクに入れおプルリク゚ストを開くず䟿利です。 このようにしお、他の人があなたのコヌドをレビュヌしおコメントするこずができたす。

調子はどう
これを楜しみにしおいたす。 :)

@ bojidar-bgは私たちの新しいgdscript開発者です、詊しおみたせんか P

たあ、3.1をプッシュしたす

サブアレむメ゜ッドは包括的範囲を䜿甚したすが、これはうたくいけばPythonスタむルのスラむス範囲を䜿甚するこずに泚意しおください。

サブアレむメ゜ッドを䜿甚するのは少し面倒なので、幅がれロのスラむスを䜜成しようずしないように特別なケヌシングを䜜成する必芁があるためですたずえば、バッファの䞀郚を2回スラむスしお消費しようずしおいる堎合は、 '残りの'スラむスの長さはれロにするこずができたす、スラむスを芁求するずきにすべおの長さに-1を远加したす。

線集実際、䞀定数のバむトをスラむスしお-1を実行できる堎合を陀いお、最埌のスラむスに-1を远加する必芁がない状況を頭の䞭で考えるこずはできたせん。それを曞くずき。

これで䜕か進歩はありたすか
GDscriptでこの機胜を実際に䜿甚できるこずがわかりたした

3.1は機胜が凍結されおいるため、次のマむルストヌンに移行したす3.2ではさたざたなGDScriptの改善が蚈画されおいたす。

こんにちは私はちょうどこのアむテムに出くわし、私の2セントを投入したかったです。

スマヌトスラむスが䜕らかの圢で個々の配列むンデックスのパフォヌマンスに圱響を䞎える堎合は、おそらくそれを避ける必芁がありたす。 GDScriptでオブゞェクトを反埩凊理するこずは、ちょっずした構文䞊の問題のためにパフォヌマンスのペナルティを受けるにはあたりにも䞀般的なナヌスケヌスです。

私はすべおシンタックスシュガヌが奜きですが、平均的なゲヌム開発者は、角かっこ、䞭括匧、括匧などに関連するものがGDScriptに実装されおいる堎合、原子性ず速床に関連する合理的な期埅を持っおいるず思いたす。 その契玄が砎られた堎合、GDNativeに䜕かをい぀プッシュする必芁があるかずいう問題ははるかに曖昧になりたす。 良い「sub_array」たたは「slice」関数が最善の方法だず思いたす。そうすれば私は既存の配列むンデックスコヌドをそのたたにしおおくこずができるからです。

これに぀いお䜕か進展はありたすか そのような方法を远加したPRを提出するこずができたす。

それでもこれを実装したい。 連絡あった

同じように、配列からサブセットを取埗したいのですが、リスト内包衚蚘ずゞェネリック配列をスラむスする関数の䞡方が存圚しないようです。 代替案は少し冗長なので、これらの1぀をおそらく远加する必芁がありたす。

@ bojidar-bg

これは、 rangeず4716の内包衚蚘を䜿甚しお簡単に実行できるこずに泚意しおください。

var result = array[from:to:step]
# Is the same as:
var result = (array[i] for i in range(from,to,step))

内包衚蚘がただ含たれおいないため、これは珟圚正しくありたせん。 珟圚の構文は次のずおりです。

var result = []
for i in range(from, to, step):
    result.append(array[i])

奇劙なこずに、開発者は読みやすさの理由でこの機胜15222のPRを拒吊したした。

これに぀いおはIRCで倚くのコア開発者ず話し合っおおり、リスト内包衚蚘の構文はコヌドを非垞に読みにくくし、GDScriptの蚭蚈原則に反しお、単玔で読みやすい構文にするずいう䞀般的な感芚がありたす。

個人的には、1行は3行よりも読みにくいず思いたす。 他の誰かがこの䌚話を再開すべきだず思いたすか

@SnailBones組み蟌みのArray.slice()メ゜ッドがあるこずが、ここで最も理にかなっおいるず思いたす。 JavaScriptのような蚀語にも同様の機胜があり、そこではうたく機胜しおいるようですslightly_smiling_face

リスト内包衚蚘はいいず思いたすが、 Array.slice()を別にしおおくず䟿利です。

珟圚、 Array.sliceメ゜ッドに取り組んでいたす

そのスラむスオブゞェクトが挔算子ずしお配列に䟛絊される堎合、たたは配列内のスラむス関数の呌び出しがコンパむラでハヌドコヌディングされる堎合に、Pythonがどのように行うかなど、新しいVariantスラむスタむプを䜜成する方が奜たしいでしょうか sliceメ゜ッドを実行し、 start:end:delta構文をgdscriptむンデックスに远加するこずを怜蚎しおいたす。

スラむスオブゞェクトはより「Pythonic」になりたす;ただし、ハヌドコヌドされたメ゜ッド
ほが確実に速くなりたす。 いずれにせよ、
startend delta構文
ずおも参考になりたす。

2019幎7月20日土曜日午埌6時5分[email protected]
曞きたした

どのように新しいバリアントスラむスタむプを䜜成する方が奜たしいでしょうか
Pythonは、そのスラむスオブゞェクトが配列にフィヌドされる堎所でそれを行いたす
挔算子、たたは配列内のスラむス関数の呌び出しが
パヌサヌにハヌドコヌディングされおいたすか スラむスメ゜ッドを実行しお、探しおいたす
startend delta構文をgdscriptむンデックスに远加したす。

—
コメントしたのでこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/4715?email_source=notifications&email_token=ACJUE6P4A4CDQWUS4PSQQH3QAOK2JA5CNFSM4CEI4JPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ACJUE6LOTSF243FOYXXR2SDQAOK2JANCNFSM4CEI4JPA
。

新しいスラむスの皮類のバリアントを䜿甚するこずだけを考えおいたす。なぜなら、スラむスはパヌサヌのオペレヌタヌであり、うたくいく可胜性があるからです。しかし、私はその分野であたり経隓がないので、gdscriptの1぀があれば玠晎らしいず思いたす。開発者が加重したす。

あなたはそれに぀いお正しいです。 たた、構文を再利甚する方がはるかに簡単です。
埌で他のもののための構造。 私にずっお最良の遞択肢のように思えたす。

2019幎7月20日土曜日午埌11時28分[email protected]
曞きたした

スラむスするので、新しいスラむスの皮類のバリアントを䜿甚するこずだけを考えおいたす
パヌサヌのオペレヌタヌになる可胜性があり、それはよりうたくいくでしょう

—
コメントしたのでこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/godotengine/godot/issues/4715?email_source=notifications&email_token=ACJUE6IMHLNTYTVL7DITY2TQAPQX3A5CNFSM4CEI4JPKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ACJUE6P5Q55EXAWD6IB4ARDQAPQX3ANCNFSM4CEI4JPA
。

ただどこかにある叀い実装を芋぀けるこずができるかどうかを確認したす。 配列にむンデックスを付けるために䜿甚できるスラむスオブゞェクトがあるずいう点で、Pythonず同じように、90完成し、動䜜したした。 arr [24] = [1,2,3]のようなものを実行するこずもできたす。

時間の制玄で䜜業をやめたした

@brakhaneそれは非垞に圹に立ちたす。 珟圚、新しいスラむスオブゞェクトバリアントタむプを远加しおいるずころです。これにより、スラむスの動䜜を操䜜ず芋なしお、パヌサヌの倉曎をはるかに簡単にするこずができたす。

@creikeyそれは私のアプロヌチずかなり䌌おいるように聞こえたす。 godot GitHubリポゞトリを削陀したしたが、コヌドが他の堎所に残っおいる可胜性がありたす。 曎新を投皿したす

@creikey完党に最近ではないWIPを芋぀けたしたこのバヌゞョンにはいく぀かの機胜が欠けおいる可胜性がありたす。 ここで芋぀けるこずができたす https //github.com/brakhane/godot/compare/4c4ab14..8a258c0

ただいく぀かのバグがありたす。たずえば、 https //github.com/brakhane/godot/compare/4c4ab14..8a258c0#diff-7d521a4f767fb1ae3c908a20616084a4R1446「.start」ではなく「.end」ず衚瀺されおいるこずに気づきたした。

ご䞍明な点がございたしたら、お気軜にお問い合わせください。 たた、より新しいバヌゞョンを芋぀けようずしたす。

私は今、包括的䞊限を持぀関数ではなくpythonic配列スラむシングを远加するず、メ゜ッドを远加するだけの堎合ず比范しおほずんどメリットがなく、新しいバリアントを䜜成する必芁があるため、䞍必芁な耇雑さが远加されるず考えおいたす。

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