0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Intersection Types

Last updated at Posted at 2024-10-26

インタフェースの型は型のアノテーション内で直接使用できない為、代わりにIntersection Type(以下、インターセクション型と記す)の一部として使用する必要があります。 インターセクション型は、Intersection内部にリストされたすべてのインタフェースに適合した一つの値を表します。

インターセクション型の構文は{U1, U2, ... Un}であり、ここで型U1からUnは、インタフェースに適合することになる型です。

インターフェースのフィールド、関数、そのセットが利用できます。

インターセクション型は、さまざまな異なる入力値で動作する関数を記述する際に便利です。例えば、引数の型にインターセクション型を使用することで、その関数はIntersection内の全ての、インタフェースを実装した値にアクセスすることができます。値はIntersection内部の機能に制限されます。関数が誤って他の機能にアクセスしようとした場合、静的チェッカーによってブロックされます。

access(all)
struct interface HasID {
    access(all)
    let id: String
}

access(all)
struct A: HasID {

    access(all)
    let id: String

    init(id: String) {
        self.id = id
    }
}

access(all)
struct B: HasID {

    access(all)
    let id: String

    init(id: String) {
        self.id = id
    }
}

// Create two instances, one of type `A`, and one of type `B`.
// Both types conform to interface `HasID`, so the structs can be assigned
// to variables with type `{HasID}`: Some resource type which only allows
// access to the functionality of resource interface `HasID`

let hasID1: {HasID} = A(id: "1")
let hasID2: {HasID} = B(id: "2")

// Declare a function named `getID` which has one parameter with type `{HasID}`.
// The type `{HasID}` is a short-hand for `AnyStruct{HasID}`:
// Some structure which only allows access to the functionality of interface `HasID`.
//
access(all)
fun getID(_ value: {HasID}): String {
    return value.id
}

let id1 = getID(hasID1)
// `id1` is "1"

let id2 = getID(hasID2)
// `id2` is "2"

インタフェースが2つ以上存在する場合は、その型を実装した値(補足: リソースまたはStruct)はその両方を実装する必要があります。

access(all)
struct interface HasMetadata {
    access(all)
    var metadata: AnyStruct
}

access(all)
struct C: HasID, HasMetadata {

    access(all)
    let id: String
    
    access(all)
    var metadata: AnyStruct

    init(id: String) {
        self.id = id
        self.metadata = []
    }

    access(all)
    fun setMetadata(_ data: AnyStruct) {
        self.metadata = data
    }
}

// valid, because `C` implements both `HasID` and `HasMetadata`.
let hasID3: {HasID, HasMetadata} = C(id: "3")

// Invalid, because `A` implements only `HasID`.
let hasID4: {HasID, HasMetadata} = A(id: "4")

翻訳元->https://cadence-lang.org/docs/language/intersection-types

Flow BlockchainのCadence version1.0ドキュメント (Intersection Types)

Previous << Enumerations

Next >> References

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?