referansla nasıl geçebilirim?
Birkaç sorum var.
İlk:
Yani, bir fonksiyonda bellek dizisi oluşturdum. Bu hafızayı başka bir fonksiyona referansla geçirmek istiyorum
function test2() public returns(uint a) {
uint[2] memory gio;
gio[0] = 100;
gio[1] = 200;
test3(gio);
return gio[0];
}
function test3(uint[2] storage arr) private returns (uint) {
arr[0] = 35;
}
Bu işe yaramıyor ve diyor ki:
İşlev çağrısındaki bağımsız değişken için geçersiz tür. Uint256 [2] belleğinden uint256 [2] depolama işaretçisine geçersiz örtük dönüştürme istendi. test3 (gio); ^ - ^
Mümkün değil mi?
İkinci
dahili ve özel işlevler, parametreleri referans türleri olarak alabilen tek işlev türüdür, değil mi? çağrılan genel ve harici işlevler başka bir uygulamaya bağımlı olabileceğinden, başka bir uygulama parametreleri referans olarak geçiremez. Kabul ?
Üçüncü .
string test;
function test2() public returns(uint a) {
test = " awesome ";
test3(test);
return 10;
}
function test3(string storage str) private {
str = " changed ";
}
Arama test2neden sonuçlanır:
TypeError: literal_string türü "değiştirildi", dolaylı olarak beklenen tür dizesi depolama işaretçisine dönüştürülemez. str = "değiştirildi"; ^ --------- ^
Yanıtlar
Bir parametreyi depolama olarak bildirdiğinizde, işlevi yalnızca bu niteleyiciye sahip parametreleri kabul edecek şekilde sınırlamış olursunuz.
Eleme storage, memoryve calldataveri bulunduğu yeri belirtin. Sen örtülü dönüştürebilirsiniz storageiçin memoryve calldatahiç memoryama tersi mümkün değildir.
string public stor = "banana";
function test(string calldata calld) external view {
string memory memo = "pizza";
foo(memo, stor);
foo(calld, stor); // Creates a copy of calld in memory and passes as parameter
foo(stor, stor); // Creates a copy of stor in memory and passes as parameter
foo(memo, stor);
// foo(memo, memo); // Cannot convert from memory to storage
// foo(memo, calld); // Cannot convert from calldata to storage
}
function foo(string memory, string storage) internal view {
}
/* This fails because you can only use calldata on external functions
function bar(string calldata) internal view {
} */
Bool, uintXXX, bytesYY, adres vb. Gibi değer türleri değere göre aktarılır. Yapılar, diziler, dizeler gibi değer olmayan türler başvuruya göre aktarılır.
Referansla iletilen türleri kullanan ve kullanabilen
public, ancak yalnızca aynı sözleşmeden çağrıldıkları takdirde işlevler .internalprivateBaşka bir sözleşmeden düzenli bir kullanıcı tarafından çağrıldığında işlev görür
publicveexternalbir kopyasını alır.
Neden bilmiyorum ama en azından solc 0.3'ten beri buna izin verilmedi.