Lesson 3 Chapter12 For ループ
Array vs Mapping
使用目的は両者とも配列、もしくは Key Value な形で "情報を格納する" ということなので、似ていますが、取得方法が違うので、使いどころには気をつける必要があります。
Array: 全件操作する
Mapping: 1件の操作をする
出典 https://qiita.com/yuhattor/items/2bd78cafd1bfd3f08b69
mapping
特定のユーザーが保有している全てのゾンビを、uint[]配列として返すgetZombiesByOwner関数を実装する。
簡単な処理とした場合
簡単な処理にすると、オーナーからゾンビ軍団へのmappingをZombieFactoryコントラクトに持たせればいい。
新しいゾンビを作る度に、
を使ってオーナーのゾンビ配列に追加していくだけだ。
するとgetZombiesByOwner関数は非常にシンプルな関数になる。
return ownerToZombies[_owner];
}
この方法の問題点
ゾンビを誰かに譲る関数をあとで作成した時の問題
必要な関数の処理。
- ゾンビを新しいオーナーのownerToZombies配列に追加する
- 元のオーナーのownerToZombies配列からゾンビを削除する
- 穴を埋めるために、元のオーナーの各ゾンビの配列の番号を変更する
- 配列のlengthを1 減らす。
もしオーナーがゾンビを20体持っていて、最初のゾンビを誰かにあげたとする。すると残りの19体の配列番号を書き直さなくてはならなくなる。
そうすればtransfer関数はstorage内の配列を並び替える必要がないため安く抑えられるし、全体のコストも抑えられる。
偶数の数字を格納する配列の例
uint[] memory evens = new uint[](5);
// 新しい配列のインデックスをトラックする:
uint counter = 0;
// 1から10までループさせる:
for (uint i = 1; i <= 10; i++) { // もし `i` が偶数なら... if (i % 2 == 0) { // 配列に格納する evens[counter] = i; // カウンタを増やして `evens`の空のインデックスにする: counter++; } } return evens; }
この関数は[2, 4, 6, 8, 10]の配列を返す。
getZombiesByOwner関数
forループでDApp内の全てのゾンビをループさせ、オーナーが一致するかどうかを判定し、result 配列に格納して返却する。
uint[] memory result = new uint[](ownerZombieCount[_owner]);
uint counter = 0;
for (uint i = 0; i < zombies.length; i++) { if (zombieToOwner[i] == _owner) { result[counter] = i; counter++; } } return result; } }
prev
-
クリプトゾンビLesson 3 Chapter11 全ゾンビアイテムの表示2
Lesson 3 Chapter11 全ゾンビアイテムの表示2 Storageのコストは高い 変数をStorageとしてデータを書き込んだり、変更するたびに、それがすべてブロックチェーンに永久に書き込 ...
next
-
クリプトゾンビLesson 4 Chapter1 Payable関数
Lesson 4 Chapter1 Payable関数 関数修飾詞の種類 可視性修飾詞 private修飾詞 コントラクト内の別の関数からのみ呼び出される。 internal修飾詞 private修飾 ...