7

rescuewhich 可以分配一个变量来引用错误对象具有这种语法( =>)

rescue => e

如果rescue是通用方法调用之一, . 的含义是什么=>?我可以在其他方法调用上使用相同的语法吗?

my_method arg1, arg2 => my_obj
4

3 回答 3

4

虽然raise确实是一种方法rescue但不是。它是一个关键字,在parse.y:10467上定义。因此,您拥有的语法是特殊的rescue(因为=> e不是任何类型的方法参数),并且对方法本身无效(至少具有相同的含义)。rescue => e我不完全确定语法本身在解析器中的定义方式/位置。

于 2012-03-13T15:57:55.333 回答
4

正如一些足球教练/哲学家国王可能会说的那样,它就是这样。这是 Ruby 的parse.y。特别感兴趣的是这部分

opt_rescue      : keyword_rescue exc_list exc_var then
                  compstmt
                  opt_rescue
                    ...
                | none
                ;

exc_list        : arg_value
                    ...
                | mrhs
                    ...
                | none
                ;

exc_var         : tASSOC lhs
                    ...
                | none
                ;

解释
exc_list基本上不允许任何异常类型或(喷溅的)一系列异常,例如rescue ZeroDivisionError, LoadError

exc_var可以什么都不是或=> some_variable

opt_rescue因此可以单独rescue或加上上述任何一个或两个。

此处仅将其列为异常赋值的特殊语法。的唯一其他用途=>键值关联

另请注意,arg_valueandmrhs位于左侧和lhs右侧,据我所知,这是发生这种情况的唯一位置。如果我在这里错了,请有人纠正我,但是 parse.y 中没有任何其他“向后”分配。

于 2012-03-13T16:01:18.680 回答
0

不,救援中的语法只在那里使用。如果在这样的函数调用中使用散列火箭'=>',它将被解释为散列,如果 arg2 之前未定义为变量,则会出错。

def foo(a,b)
  puts b.inspect
end

foo "bar", :baz => 5   #=> {:baz=>5}

foo "bar", baz => 5    #=> NameError: undefined local variable or method `baz'

baz = "flux"

foo "bar", baz => 5   #=> {"flux"=>5}
于 2012-03-13T15:58:47.183 回答