Ruby中throw单独携带第二个参数时的行为是否符合预期?
Ruby中无catch块时throw带第二个参数的行为解答
结论
这是Ruby的预期行为,属于语言设计的既定规则,并非bug。
原因解析
Ruby的throw方法逻辑分两种情况:
- 仅传入key参数时:必须有对应的
catch块匹配捕获,否则直接抛出UncaughtThrowError,这就是你第三个例子报错的原因。 - 传入key+第二个参数时:如果找不到匹配的
catch块,Ruby会检查第二个参数是否为可调用对象(比如方法对象、Proc、lambda这类可以用call执行的对象)。如果是,就自动调用这个对象;如果不是可调用对象,仍然会抛出UncaughtThrowError。
你最后一个例子里,stop_script作为方法名传递时,Ruby会自动把它转为Method实例(属于可调用对象),所以当没有catch块时,Ruby直接执行了这个方法,才会出现"CTRL_C seen"的输出并退出脚本。
补充验证例子
如果把第二个参数换成非可调用对象,比如字符串,依然会报错:
trap("SIGINT") { throw :ctrl_c, "test" } (1..).each {|n| print "."; sleep 0.5 }
触发SIGINT时,会抛出:uncaught throw :ctrl_c (UncaughtThrowError),符合预期逻辑。
内容的提问来源于stack exchange,提问作者dpneumo
相关产品推荐
相关产品推荐

