Genie Vala Generics和Nullable Types

问题描述 投票:1回答:2

简单的问题:在下面的泛型类中,如何定义泛型类型和包含的类型以使它们可以为空?以下内容无法编译。

class Pair? of G1, G2: Object

    _first:G1?
    _second:G2?

    construct()

        _first = null
        _second = null

    def insert( first:G1, second:G2 )

        _first = first
        _second = second

    def insert_first( value:G1 )

        _first = value

    def insert_second( value:G2 )

        _second = value

    def second():G2

        return _second

用法:

var pair = new Pair() of string, string
pair = null
gtk3 gnome vala genie
2个回答
2
投票

由于Vala Generics的工作方式,通用参数始终可以为空。

只要你不打开--enable-experimental-non-null类变量也可以为空,所以你的代码简化为:

[indent=4]
class Pair of G1, G2: Object

    _first:G1
    _second:G2

    construct()

        _first = null
        _second = null

    def insert( first:G1, second:G2 )

        _first = first
        _second = second

    def insert_first( value:G1 )

        _first = value

    def insert_second( value:G2 )

        _second = value

    def second():G2

        return _second

init
    var pair = new Pair of string, string
    pair = null

--enable-experimental-non-null打开时,您必须明确变量的类型。我不知道如何在Genie中写这个,我试过这个,但是编译器不喜欢它:

init
    pair: Pair? of string, string = new Pair of string, string
    pair = null

在Vala,没问题:

class Pair<G1,G2>: Object {
    private G1 first;
    private G2 second;

    public Pair () {
        first = null;
        second = null;
    }

    // ...
}

int main () {
    Pair<string, string>? pair = new Pair<string, string> ();
    pair = null;
    return 0;
}

2
投票

我无法理解类型为null的类型参数的概念。我认为这不是一个有用的概念。所以你的班级的定义是:

[indent = 4]
class Pair of G1, G2: Object

    _first:G1?
    _second:G2?

    def insert( first:G1, second:G2 )
        _first = first
        _second = second

    def insert_first( value:G1 )
        _first = value

    def insert_second( value:G2 )
        _second = value

    def second():G2
        return _second

如果必须将具有对象实例的变量重新分配给null,那么它将是:

[indent = 4]
init
    var pair = new Pair of string,string()
    pair = null

但是,当Vala编译器超出范围时,它将取消引用pair。所以我不确定为什么你需要指定null。

理想情况下,只有在我的视图中与C库连接时才使用空值。如果没有正确检查,访问null可能会导致崩溃(分段错误)。例如:

init
    a:int? = 1
    a = null
    var b = a + 1

Vala编译器确实有一个实验性的非null模式,可以检查不安全的代码。如果使用Vala开关--enable-experimental-non-null编译以下内容:

[indent = 4]
init
    var pair = new Pair of string,string()
    pair = null

你会得到错误:

error: Assignment: Cannot convert fromnull'到Pair<string,string>'

如果您了解后果,那么您可以通过以下方式告诉编译器:

[indent = 4]
init
    pair:Pair? = new Pair of string,string()
    pair = null
© www.soinside.com 2019 - 2024. All rights reserved.