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
。
希望这能澄清一些事情。
- 在rails中,如何在function测试中存根渲染方法?
- 无法加载这样的文件 – 2.2 / gherkin_lexer_en,如何修复?
- 使用自定义URL(例如http:// localhost:3000 / education_informations / new?user_id = 10)在新页面上呈现错误
- 知道resque工人何时完成了工作
- 如何在ROR中解决loaderror
- Rails 3.1和Ruby 1.9.3p125:ruby-debug19仍然崩溃,“未找到符号:_ruby_threadptr_data_type”
- heroku:运行rake db:migrate错误
- 如何在ruby中引用子模块的“完整路径”?
- 如何在ruby中产生延迟