Ruby救援式语法

我想用类似救援的语法实现一些东西。

begin raise "Failed" rescue Exception => e puts e end 

这有效,并且e被分配给相应的值。 但是在一个方法中使用,这将引发一个exception,说e未定义。 换句话说,救援如何在不抛出未定义错误的情况下以这种方式分配某些东西?

 class MyClass def to_s "hello" end end def my_method puts e.to_s end my_method(MyClass => e) #=> undefined local variable or method `e' for main:Object 

也许您正在寻找的是:

 class MyClass def self.hello puts "This is a class method." end def bye puts "This is an instance method." end end def my_method(params) klass = params[:class] puts klass.hello # Call a class method inst = klass.new # Create an instance puts inst.bye # Call an instance method end my_method(:class => MyClass) 

需要注意三点:

  • 尽管rescue语法和“命名参数”语法看起来相同,但它们的共同点是=>运算符。 在第一种情况下,您告诉要将Exception “转换”到变量e ,将其有效地存储在该变量中。 在第二种情况下,您告诉Ruby收集传递给方法的所有参数,并使用提供的键/值对将它们存储在散列中。 实际上,您将MyClass存储在key :class下的params哈希中。
  • 在上面的示例中, to_s定义在MyClass本身上不可调用,因为您将其定义为实例方法。 实例方法仅在使用inst = MyClass.new创建类的“实例”时可用。 然后,您可以调用inst.to_s 。 将类视为事物的抽象“类型”,将实例视为该类型的具体事物。 如果您希望该方法在类而不是实例上可用,则需要在self.前面加上它self. 我已经说明了上面的两种不同的语法。
  • 再次在您的示例中,您正在使用def MyClass ,Ruby将其解释为“使用名称MyClass定义方法”。 如果要定义类,则需要使用class MyClass

希望这能澄清一些事情。