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"
在 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"