【Nim】基本数据类型
1、整数类型
有符号的
echo sizeof(int) # 取决于系统和编译器,一般是4
echo sizeof(int8) # size = 1
echo sizeof(int16) # size = 2
echo sizeof(int32) # size = 4
echo sizeof(int64) # size = 8proc foo1(x: int64) =echo x# 接受任意有符号整数,同等于"int|int8|int16|int32|int64",比直接指定int64更语义化
proc foo2(x: SomeSignedInt) =echo xfoo1(888i64)
foo2(888i64)
无符号的
echo sizeof(uint) # 取决于系统和编译器,一般是4
echo sizeof(uint8) # size = 1
echo sizeof(uint16) # size = 2
echo sizeof(uint32) # size = 4
echo sizeof(uint64) # size = 8proc foo1(x: uint64) =echo x# 接受任意无符号整数,同等于"uint|uint8|uint16|uint32|uint64",比直接指定uint64更语义化
proc foo2(x: SomeUnsignedInt) =echo xfoo1(888u64)
foo2(888u64)
如果打算接受有符号和无符号的,可以用SomeInteger
# 接受任意整数类型,同等于"SomeSignedInt|SomeUnsignedInt"
proc foo(x: SomeInteger) =echo xfoo(888i64)
foo(888u64)
2、浮点类型
echo sizeof(float) # 取决于系统和编译器,一般是8
echo sizeof(float32) # size = 4
echo sizeof(float64) # size = 8# 接受任意浮点类型,同等于"float|float32|float64"
proc foo(x: SomeReal) =echo xfoo(3.14f)
foo(3.14f32)
foo(3.14f64)
foo(2e2)
如果可以接受任何数字类型,可以用SomeNumber
# 接受任意数字类型,同等于"SomeInteger|SomeReal"
proc foo(x: SomeNumber) =echo xfoo(666)
foo(3.14f)
foo(888u64)
二、布尔值
var b: boolecho sizeof(b) # size = 1echo b # 默认值为falseb = on # true的别名
echo b # trueb = off # false的别名
echo b # false# bool本质上是枚举类型,只可以赋值0或1
b = bool(0)
echo b # 0 = falseb = bool(1)
echo b # 1 = true# 编译错误
#b = bool(2)
三、字符
echo sizeof(char) # size = 1,本质上是uint8类型var c: char = 'a'
echo c
echo ord(c) # 97,ord方法得到字符的ascii码
echo chr(98) # 'b',chr方法将数字转换为字符var s: string = $c # 将char类型赋值给string类型必须在前面加上美元符号
echo s
四、字符串
var s: string# 未赋值时是nil
if s == nil:echo "s == nil"s = "hello"
echo len(s) # len = 5
echo s[0] # 'h'
echo ord(s[5]) # string以'\0'字符结束s.add(" 世") # 用add方法在末尾追加字符串
s &= "界" # 字符串之间用'&'符号连接
echo s # hello 世界
严格来讲,Nim并没有Python、C#那样真正的字符串,而是和C/C++中string一样,其本质就是array[char]类型,在Nim中应该表示为seq[char]。所以string硬编码字符串的编码格式取决于源文件编码,一般是utf8
var s = "hello"
echo s.addr.reprvar s2 = s
echo s2.addr.repr
输出:
ref 0042BD1C --> 0095A030"hello"
ref 0042BD14 --> 0095A048"hello"
可见内存地址不同,所以在Nim这里,不像Python、C#那样有不可变数据的说法。
字符串之间的赋值就等同于是数组的完整拷贝,这么做是非常低效的,一定要注意。
如果需要使用引用,可以试试shallowCopy方法
proc foo() =var s = "hello"var s2: stringvar s3: stringshallowCopy(s2, s)shallowCopy(s3, s2)echo s.addr.reprecho s2.addr.reprecho s3.addr.reprfoo()
这样3个字符串都指向同一内存了,还可以这样用
proc foo() =var s = "hello"s.shallow # 调用之后,赋值操作将会变为传递引用var s2 = svar s3 = s2echo s.addr.reprecho s2.addr.reprecho s3.addr.reprfoo()
但shallow也有副作用,编译器在某些情况下可能会忽略掉它,比如全局变量
var s = "hello"
s.shallowvar s2 = s
var s3 = s2echo s.addr.repr
echo s2.addr.repr
echo s3.addr.repr
同样的代码,从foo函数中挪到全局中,结果三个字符串的地址还是不同
再或者源字符串发生变化,后面的引用的变量是感知不到的
var s = "hello"
s.shallowvar s2 = s
var s3 = s2echo s.repr
echo s2.repr
echo s3.reprs.add("world")echo s.repr
echo s2.repr
echo s3.repr
所以shallow也并非是完美的办法,期待Nim在以后的版本中能提供像Python那样不可变的string。
最后,多行字符串用三个双引号括起来
vars = """line1
line2
line3"""echo s
参考:
https://nim-lang.org/docs/tut1.html#basic-types
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
