proc myproc(T: typedesc): string =
when T is bool:
return "bool"
when T is float:
return "float"
echo myproc(bool)
错误:'return','break','raise'后不允许声明, '继续'或使用noreturn pragma进行调用
使用elif
有效,但要求链接的when / else语句是不合理的吗?
答案 0 :(得分:2)
真正的问题是:当你需要做的只是编写时,任何人都可以从允许编译代码中获得什么
when T is bool:
return "bool"
elif T is float:
return "float"
您的代码不会缩短,也不能做其他事情无法实现的事情。因此,允许您的代码编译只会给编译器带来额外的负担而不会有任何投资回报。我的代码也使意图更清晰:要么做一件事,要么做其他事情,而你的代码说也许这样做,也许那样做。
我不知道实现细节,但我认为编译器证明T is bool
和T is float
是不相交的并不是一件容易的事。
编辑证明没有任何好处
假设我们的身体以
开头when T is bool: return "bool"
显然,如果T is bool
在编译时计算为true
,则会编译无条件return
语句,并且可能后面没有语句。也就是说,when
块之后的所有语句必须在编译时被吞下,除非上述条件为false
。
我相信在编译时基本上可以吞下两个不同的语句:其他when
语句和对模板或宏的调用(它们可能返回一个空的AST节点)。我已经证明,成功的when
可能会被elif
取代而不会失去任何表现力。现在让我们看一下宏或模板调用:
when T is bool: return "bool"
call(T)
这可以通过将其重写为:
轻松解决when T is bool: return "bool"
else: call(T)
我承认我们这里有更多的代码,但是我没有看到我们从遗漏else:
中获得任何实际收益。
如果您仍然不相信,我邀请您提供您认为可以获得实际利益的示例代码,以便我们进行讨论。