语句¶
Vyper 的语句在语法上类似于 Python,但有一些显著的例外。
控制流¶
break¶
break
语句终止最近的封闭 for
循环。
for i in [1, 2, 3, 4, 5]:
if i == a:
break
在上面的示例中,如果 i == a
,则 for
循环终止。
continue¶
continue
语句开始最近的封闭 for
循环的下一个循环。
for i in [1, 2, 3, 4, 5]:
if i != a:
continue
...
在上面的示例中,每当 i != a
时,for
循环立即开始下一个循环。
pass¶
pass
是一个空操作——当它被执行时,什么也不会发生。当语法上需要一个语句,但不需要执行任何代码时,它可以用作占位符。
# this function does nothing (yet!)
@external
def foo():
pass
return¶
return
退出当前函数调用,并以表达式列表(或 None)作为返回值。
return RETURN_VALUE
如果函数没有返回值类型,则可以省略 return
语句,否则,函数必须以 return
语句结束,或者以其他终止操作结束,例如 raise
。
在 return
语句之后,不允许存在其他不可到达的语句。
断言和异常¶
Vyper 使用状态回滚异常来处理错误。异常触发 REVERT
操作码(0xFD
),并提供提供的理由作为错误消息。当抛出异常时,代码停止运行,合约的状态回滚到交易发生前的状态,剩余的 gas 返回给交易的发送者。当子调用中发生异常时,它会自动“冒泡”起来(即异常被重新抛出)。
如果理由字符串设置为 UNREACHABLE
,则使用 INVALID
操作码(0xFE
)而不是 REVERT
。在这种情况下,回滚的调用不会收到 gas 退款。这不是一般使用情况下推荐的做法,但它可用于与使用 INVALID
操作码进行动态分析的各种工具进行互操作。
assert¶
assert
语句对给定条件进行断言。如果条件评估为假,则交易将回滚。
assert x > 5, "value too low"
错误字符串不是必需的。如果提供了它,它将限制为 1024 字节。
此方法的行为等效于
if not cond:
raise "reason"