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

Does Nim support types with immutable fields?

在 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 中做同样的事情(或达到预期效果的事情)吗?

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"