Nim是否支持带有不可变字段的类型?

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

在C#中,您可以执行此操作

public class Foo
{
    public string Name { get; private set; }

    public Foo(string name)
    {
        Name = name;
    }
}

public static void Main()
{
    var foo = new Foo("Foo Object");

    Console.WriteLine(foo.Name);

    // Will not compile
    // foo.Name = "Bar Object";
}

您可以在Nim中执行相同的操作(或具有预期效果的操作吗?

immutability nim-lang
1个回答
2
投票

Nim在类型范围上没有封装(并且由于Nim不是面向对象的语言,所有数据处理都与数据本身分开,因此没有意义)。使用模块范围封装可以达到相同的效果:

foo.nim:

type Foo* = ref object
    name: string

proc newFoo*(name: string): Foo =
    new result
    result.name = name

proc name*(self: Foo): string =
    self.name

main.nim:

import foo

let f = newFoo("Foo Object")
echo f.name

# Error: attempting to call undeclared routine: 'name='
# f.name = "Bar Object"
© www.soinside.com 2019 - 2024. All rights reserved.