https://zhuanlan.zhihu.com/p/710551238
接上文。
看 0.53.4 的发布文档中的语法更改部分,发现 from x import y.*
改成了 import x.y.*
,更简化了。在内测阶段估计会常有此类语法修改。
于是改成:
import std.random.*
main() {
let 想的 = Random()
var 猜的 = 50
if (猜的 > 想的) {
println("大了")
} else if (猜的 < 想的) {
println("小了")
} else {
println("中了!")
}
}
报错:
error: invalid binary operator '>' on type 'Int64' and 'Class-Random'
==> tests/hi.cj:6:14:
|
6 | if (猜的 > 想的) {
| ^
|
# note: you may want to implement 'operator func >(right: Class-Random)' for type 'Int64'
error: invalid binary operator '<' on type 'Int64' and 'Class-Random'
==> tests/hi.cj:8:21:
|
8 | } else if (猜的 < 想的) {
| ^
|
# note: you may want to implement 'operator func <(right: Class-Random)' for type 'Int64'
2 errors generated, 2 errors printed.
看来需要把 Random 转为 Int64 先。但float不能乘Int:
error: invalid binary operator '*' on type 'Float64' and 'Int64'
==> tests/hi.cj:4:38:
|
4 | let 想的 = Random().nextFloat64()*20
| ^
|
# note: you may want to implement 'operator func *(right: Int64)' for type 'Float64'
改为 let 想的 = Random().nextFloat64()*40.0
后,仍无法比较 Int 和 Float:
error: invalid binary operator '>' on type 'Int64' and 'Float64'
==> tests/hi.cj:6:14:
|
6 | if (猜的 > 想的) {
| ^
|
# note: you may want to implement 'operator func >(right: Float64)' for type 'Int64'
error: invalid binary operator '<' on type 'Int64' and 'Float64'
==> tests/hi.cj:8:21:
|
8 | } else if (猜的 < 想的) {
| ^
|
# note: you may want to implement 'operator func <(right: Float64)' for type 'Int64'
2 errors generated, 2 errors printed.
试试把 nextFloat64 改成 nextInt64:let 想的 = Random().nextInt64()%50
但是输出发现会是负数,试后发现 -5%3 = -2,对比 python 的 -5%3 = 1
于是猜要用 abs,但报错:error: undeclared identifier 'abs'
猜要导入 std.math.*,看到文档例程果然如此。如下终于编译通过:
import std.random.*
import std.math.*
main() {
let 想的 = abs(Random().nextInt64()%50)
var 猜的 = 20
if (猜的 > 想的) {
println("大了")
} else if (猜的 < 想的) {
println("小了")
} else {
println("中了!")
}
}
没找到类似python里的取输入函数 input(),希望文档更完善。先跳过此部分。
用 for 循环,发现 1..=50 是 [1,50], 1..50 是 [1,50)。和木兰的设计有点像,不过木兰的..是默认闭区间: 1..50 是 [1,50], 1..<50 是 [1,50)。个人感觉木兰的设计更接近直观,因为 .. 两端对称对应着两端都是闭区间。
import std.random.*
import std.math.*
main() {
let 想的 = abs(Random().nextInt64()%50)
for(猜的 in 1..50) {
if (猜的 > 想的) {
println("大了")
} else if (猜的 < 想的) {
println("小了")
} else {
println("中了!")
break
}
}
}
想输出最后 猜的
值,如果这样直接加会报错:
error: invalid binary operator '+' on type 'Int64' and 'Struct-String'
==> tests/hi.cj:13:22:
|
13 | println(猜的 + "中了!")
| ^
|
# note: you may want to implement 'operator func +(right: Struct-String)' for type 'Int64'
看文档改成插值:
import std.random.*
import std.math.*
main() {
let 想的 = abs(Random().nextInt64()%50)
for(猜的 in 0..50) {
if (猜的 > 想的) {
println("大了")
} else if (猜的 < 想的) {
println("小了")
} else {
println("${猜的} 中了!")
break
}
}
}
另外,测试时发现 想的
可能为0,因此改成 0..50。
到此基本完成 木兰入门的猜数字例程。还有 input 部分,待续。
另: @知乎小管家 可以在文章编辑器的代码高亮添加“仓颉”吗?