1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bevyのsystemは16を超える引数はとれない

Last updated at Posted at 2024-04-23

結論: タプルあるいはSystemParamを使えば解決

(追記):以下に「16を超える引数はとれないよ」って書いてあって、対応策もちゃんと書いてあった。ただ実装上の関係か、タプルを使うと各16パラメータまでとのこと。(16 x 16 = 256なので、SystemParamを使わなくてもこれだけあれば十分。)

https://bevy-cheatbook.github.io/programming/systems.html

背景: systemに17以上の引数を与えると、意味不明なエラーが出る。

systemに互換のない引数を定義するとエラーが出る(詳細は下記)のだけれど、引数が16を超えると、互換があるはずなのに同様のエラーが出て、にっちもさっちもいかなくなる。特徴は、'a, 'b, 'c, 'd, 'e, ... が妙に多いことくらいで、実はこの数は16にはならないのでさらに解明を難しくする。

https://bevy-cheatbook.github.io/pitfalls/into-system.html

トレイトの定義も複雑なので、やっとのことで該当行にたどり着いた。

確かに 16 という数字がコード中にあり、これ以上の引数はとれないので SystemParam を使ってねという趣旨のメモが残されている。

// Note that we rely on the highest impl to be <= the highest order of the tuple impls
// of `SystemParam` created.
all_tuples!(impl_system_function, 0, 16, F);

Rustのタプル自体は数の上限はないはずなので、何かしら別の実装上の要因があってのことと思われるが、詳細は未調査。

もしかしたら今後改善されるかもしれないけれど、たぶん望み薄なので、引数が多いときは素直にタプルか SystemParam を使ったほうがよさそう。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?