在Ruby中有什么区别
def run
begin
raise SomeError.new
rescue SomeError
handle
end
end
和
def run
raise SomeError.new
rescue SomeError
handle
end
答案 0 :(得分:1)
相同,没有区别。第二个是第一个的简写。
答案 1 :(得分:1)
示例:强>
begin
# something which might raise an exception
rescue SomeExceptionClass => some_variable
# code that deals with some exception
ensure
# ensure that this code always runs
end
此处,def
为begin
声明:
def
# something which might raise an exception
rescue SomeExceptionClass => some_variable
# code that deals with some exception
ensure
# ensure that this code always runs
end
基本上没有区别。在上面的代码方法中,def
可以作为begin
语句:
正如spickermann评论你也可以使用else
只有在没有预期的情况下才能运行
begin
# -
rescue OneTypeOfException
# -
rescue AnotherTypeOfException
# -
else
# Other exceptions
end
对于rescue
块中的每个begin
子句,Ruby依次将引发的Exception与每个参数进行比较。如果rescue
子句中指定的异常与当前抛出的异常的类型相同,或者是该异常的超类,则匹配将成功。如果begin语句正文中的代码运行完成而没有异常,则执行 else
子句中的代码。如果发生异常,则显然不会执行else
子句。
请参阅此内容以获取更多理解:http://rubylearning.com/satishtalim/ruby_exceptions.html
答案 2 :(得分:1)
您提出的2个代码之间没有区别。您唯一希望使用$("#menu1 li a").click(function (e) {
$(this).next("ul").toggle("slow");
e.preventDefault();
});
$("#menu2 li a").click(function (a) {
$(this).next("ul").toggle("slow");
a.preventDefault();
});
的方法是,如果您只想要拯救某部分代码。
begin
它还提醒您不要只使用def rescue_me
no_rescue = 1 + 1
begin
no_rescue / 0
rescue
# handle
end
end
。您应该知道要拯救的异常。在上面的示例中,您要抢救rescue
。
答案 3 :(得分:1)
它们是等效的,即使它们不生成相同的代码。大多数更改只是重新编号,但第一个中有一些额外的指令(在此统一差异中由-
标记)。虽然它们做得不多(主要是trace
和标签)。
["YARVInstructionSequence/SimpleDataFormat", 2, 2, 1,
{:arg_size=>0, :local_size=>1, :stack_max=>4},
"<compiled>", "<compiled>", nil, 1, :top, [], {}, [],
[1,
[:trace, 1],
[:putspecialobject, 1],
[:putspecialobject, 2],
[:putobject, :run],
[:putiseq,
["YARVInstructionSequence/SimpleDataFormat", 2, 2, 1,
{:arg_size=>0, :local_size=>1, :stack_max=>2},
"run", "<compiled>", nil, 1, :method, [], {},
[[:rescue,
["YARVInstructionSequence/SimpleDataFormat", 2, 2, 1,
{:arg_size=>0, :local_size=>2, :stack_max=>2},
"rescue in run", "<compiled>", nil, 2, :rescue, [:"\#$!"], {}, [],
- [4,
- [:trace, 1],
+ [3,
[:getlocal_OP__WC__0, 2],
- [:getinlinecache, :label_11, 0],
+ [:getinlinecache, :label_9, 0],
[:getconstant, :SomeError],
[:setinlinecache, 0],
- :label_11,
+ :label_9,
[:checkmatch, 3],
- [:branchunless, :label_21],
- 5,
+ [:branchunless, :label_19],
+ 4,
[:trace, 1],
[:putself],
[:opt_send_without_block, {:mid=>:handle, :flag=>280, :blockptr=>nil, :orig_argc=>0}],
- 4,
+ 3,
[:leave],
- :label_21,
+ :label_19,
0,
[:getlocal_OP__WC__0, 2],
[:throw, 0]]],
- :label_4,
- :label_18,
- :label_19,
+ :label_2,
+ :label_16,
+ :label_17,
0],
- [:retry, nil, :label_18, :label_19, :label_4, 0]],
+ [:retry, nil, :label_16, :label_17, :label_2, 0]],
[1,
[:trace, 8],
+ :label_2,
2,
[:trace, 1],
- :label_4,
- 3,
- [:trace, 1],
[:putself],
- [:getinlinecache, :label_14, 0],
+ [:getinlinecache, :label_12, 0],
[:getconstant, :SomeError],
[:setinlinecache, 0],
- :label_14,
+ :label_12,
[:opt_send_without_block, {:mid=>:new, :flag=>256, :blockptr=>nil, :orig_argc=>0}],
[:opt_send_without_block, {:mid=>:raise, :flag=>264, :blockptr=>nil, :orig_argc=>1}],
- :label_18,
- 2,
+ :label_16,
[:nop],
- :label_19,
- 7,
+ :label_17,
+ 5,
[:trace, 16],
- 3,
+ 2,
[:leave]]]],
[:opt_send_without_block,
{:mid=>:"core#define_method", :flag=>256, :blockptr=>nil, :orig_argc=>3}],
[:leave]]]
答案 4 :(得分:0)
在这种特定情况下,除了选项1看起来更加丑陋之外没有区别,
救援适用于代码上下文,方法是设置begin...end
您创建适用rescue
的代码上下文,
第二个选项有效是因为方法def...end
也是代码上下文
答案 5 :(得分:0)
两者都是不同语法的相同内容。后来用于挽救整个方法而不是代码块。
答案 6 :(得分:0)
IT看起来都是一样的。在第二个代码中,它为您提供了更多代码。