Nim 中的 value/reference 类型是否与 Swift 中的类型相同?
Does value/reference types in Nim works same way as in Swift?
我正在尝试更好地理解值类型背后的原因。
Nim 中的 value/reference 类型是否与 Swift 中的类型相同?
是的,值和引用类型在 Nim 中的工作方式与在 Swift 和其他低级编程语言(如 C#、C++、Rust)中一样。我的意思是他们在复制方面遵循这些语义:
值语义意味着副本拥有它的内存并且与被复制的分开存在。
引用语义表示拷贝和被拷贝引用相同的底层内存位置。
(取自this forum answer)。
举个例子,我翻译this swift blog post to nim (playground):
# port of https://developer.apple.com/swift/blog/?id=10 to Nim
## Example of Value type
type S = object
data: int # I cannot say the default of data is -1. Nim does not have (yet) custom initialization, see accepted RFC https://github.com/nim-lang/RFCs/issues/252
var a = S()
var b = a
a.data = 42
echo (a, b) # ((data: 42), (data: 0))
## Example of Reference type
type C = ref object
data: int
func `$`(c: C): string = "C(data: " & $(c.data) & ")" # there is no default $ for ref objects as there is for objects
var x = C()
var y = x
x.data = 42
echo (x, y) # (C(data: 42), C(data: 42))
注意:
- Nim 没有 copy-on-write mechanism for value types as in Swift (but you can build your own CoW type)
- Nim 没有像 Swift 这样的
===
运算符(参见 this discussion)。
我正在尝试更好地理解值类型背后的原因。
Nim 中的 value/reference 类型是否与 Swift 中的类型相同?
是的,值和引用类型在 Nim 中的工作方式与在 Swift 和其他低级编程语言(如 C#、C++、Rust)中一样。我的意思是他们在复制方面遵循这些语义:
值语义意味着副本拥有它的内存并且与被复制的分开存在。
引用语义表示拷贝和被拷贝引用相同的底层内存位置。
(取自this forum answer)。
举个例子,我翻译this swift blog post to nim (playground):
# port of https://developer.apple.com/swift/blog/?id=10 to Nim
## Example of Value type
type S = object
data: int # I cannot say the default of data is -1. Nim does not have (yet) custom initialization, see accepted RFC https://github.com/nim-lang/RFCs/issues/252
var a = S()
var b = a
a.data = 42
echo (a, b) # ((data: 42), (data: 0))
## Example of Reference type
type C = ref object
data: int
func `$`(c: C): string = "C(data: " & $(c.data) & ")" # there is no default $ for ref objects as there is for objects
var x = C()
var y = x
x.data = 42
echo (x, y) # (C(data: 42), C(data: 42))
注意:
- Nim 没有 copy-on-write mechanism for value types as in Swift (but you can build your own CoW type)
- Nim 没有像 Swift 这样的
===
运算符(参见 this discussion)。