Solidity Dizi Dilimleri (Array Slices) Nedir?

Solidity Dizi Dilimleri Nedir?

Solidity'de dizilerin (arrays) ardından dizi dilimlerini (array slices) inceleyeceğiz. Hadi başlayalım.

Array Slices Nedir?

Dizi dilimleri, array slices, bir dizinin elemanlarını parçalamamızı ve sonrasında erişebilmemizi sağlayan bir görünümdür. Bir dizinin içerisinden başlangıç ve bitiş sıralarına (index) bakarak belirli aralıkları almamıza ve yeni bir dizi oluşturmamıza imkan verir.

Python'da Array Slices Örneği

arrays = [1,2,3,4,5];
# [0,2) 0.index dahil ama 2. indeks değil
arraySlices = arrays[0:2]; # Sonuç: [1,2]
print(arraySlices);


arrays1 = ["a", "b", "c","d","e"];
# [2,3) 2.indeks dahil ama 3.indeks değil
arraySlices1 = arrays1[2:3]; # Sonuç: [c]
print(arraySlices1);

Javascsript'te Array Slices Örneği

const hayvanIsimleri = ["Kedi", "Köpek", "Kuş", "At", "Balık"];
// [2,4)
const ilkIkiHayvan = hayvanIsimleri.slice(2, 4);
console.log(ilkIkiHayvan); // Sonuç: => ["Kuş", "At"]

Solidity'de Array Slices Nedir?

Solidity programlama dilinde de dizi dilimleri (array slices) aynı görevde kullanılmaktadır. start ve end değerlerinin arasına : koyularak array[start:end] şeklinde kullanılmaktadır. start ve end dizinin indeksini belirttiğinden dolayı uint256 türündedir.

Solidity'de dizi dilimlemede (array slices) önemli bazı noktalar şunlardır:

  1. end değeri start değerinden büyük olamaz. Aksi taktirde hata fırlatılır.
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.12;


contract ArraySlices{
 
    function getArraySlices(uint256[] calldata array) public returns(uint256[] memory){
        return array[5:2]; // Sonuç: => Hata döner. Bu kullanım sonucunda işlem hata fırlatacaktır. 
    }


  1. 2022 Ağustos itibariyle Solidity'de yalnızca calldata veri konumundaki dinamik dizilerde dilimleme (array slicing) yapılabilir. İleri tarihlerde gelen güncellemelerle değişebilir.
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.12;


// Dizi Dilimleri ve Solidity
contract ArraySlices{
    uint256[] public arrays = [1,2,3,4];


    function getArraySlices(uint256 start, uint256 end) public returns(uint256[] memory){
        //return arrays[start:end]; //  Sonuç: => Hata döner. TypeError: Index range access is only supported for dynamic calldata arrays.
    }
}


contract ArraySlices1{
    function getArraySlices(uint256[] calldata array) public returns(uint256[] memory){
        return array[0:2]; // Sonuç: => uint256[]: 1,2"
    }
}


contract ArraySlices2{
    function getArraySlices(bytes1[] calldata array) public returns(bytes1[] memory){
        return array[0:2]; // Sonuç: => uint256[]: 1,2"
    }


    // function getArraySlices1(bytes[] calldata array) public returns(bytes[] memory){
    //     return array[0:2]; //   Sonuç: => Hata döner.  Index range access is not supported for arrays with dynamically encoded base types.
    // }
    // function getArraySlices1(bytes1[5] calldata array) public returns(bytes1[] memory){
    //     return array[0:2]; //  Sonuç: => Hata döner.  Index range access is only supported for dynamic calldata arrays.
    //
  1. Varsayılan olarak start değeri 0 iken end değeri dizinin uzunluğuna eşittir.
  2. Dizi diliminin ilk elemanı array[start] iken son elemanı array[end-1]'dir. Yani a = [1,2,3,4] dizisinden alınan a[0:3] dizi diliminde ilk eleman a[0] = 1 iken son eleman a[3-1] = a[2] = 3 olacaktır. a[0:3] dizi dilimi [1,2,3] olacaktır. Buradaki eşitlikleri temsili olarak verdiğimi unutmayınız.

Dizi dilimlerine (array slices) dair aktarmak istediğim bilgiler bunlardı. İlerleyen zamanlarda Solidity zincirine yeni örnekler eklemeyi planlıyorum. Takipte kalın.

Yorumunu Bırak

Çok hızlısın. Biraz dinlendikten sonra tekrar devam edebilirsin.
Bugünlük gönderebileceğin kadar yorum gönderdin. Lütfen yarın tekrar dene.
Mesajınız bize başarılı bir şekilde ulaştırıldı. Teşekkürler.

Yorumlar

0 Yorum yok

Henüz yorum yapılmamış. İlk yorum yapan sen ol.

Blog Yazarı

Ömer Faruk Coşkun
Yazar
@ofcskn

İstanbul Üniversitesi Bilgisayar Mühendisliği Öğrencisi