2012-03-12 85 views
0

我想用類似救援的語法來實現一些東西。Ruby類似救援的語法

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

這是有效的,並且e被分配給相應的值。但是在一個方法中使用,這會引發一個異常,說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 
+0

爲什麼你不只是傳遞MyClass作爲參數? – 2012-03-12 14:44:22

+0

事實上,我只是想知道救援工作如何...... :-) – christianblais 2012-03-12 14:51:27

+0

這是一個句法結構,是lex/parse過程的一部分。你必須改變語言。 – 2012-03-12 14:55:21

回答

1

也許你正在尋找的是:

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語法和「命名參數」語法看起來是一樣的,都是他們共同點是=>運營商。在第一種情況下,您告訴rescueException「變成」變量e,將其有效地存儲在該變量中。在第二種情況下,您告訴Ruby收集傳遞給該方法的所有參數,並使用提供的鍵/值對將它們存儲在散列中。實際上,您正在存儲MyClass,params哈希中的密鑰:class
  • 在上例中,to_s定義在MyClass本身上不可調用,因爲您將其定義爲實例方法。實例方法僅在您使用inst = MyClass.new創建類的「實例」時纔可用。然後,您可以撥打inst.to_s。把這個類看作是一個抽象的「類型」的事物,把這個實例看作是這種類型的具體事物。如果你想讓該方法在類中可用,而不是實例,則需要在self.前加上我已經說明了上面兩種不同的語法。
  • 再次在您的示例中,您使用的是def MyClass,Ruby將其解釋爲「定義名稱爲MyClass的方法」。如果您想定義一個班級,則需要使用class MyClass

希望這可以澄清一些事情。

+0

根據你所說的,即「在第一種情況下,你是在告訴拯救例外」變成「變量e,將其有效地存儲在變量中」,是否有可能再現完全相同的特徵? – christianblais 2012-03-12 16:36:40

+0

正如其他人所評論的,不,這是不可能的。這就是常規或「命名」的方法參數!有一種方法依賴於在方法定義內部沒有定義的參數,這是很麻煩的。我想這就是爲什麼我不知道任何支持它的語言:-) – user2398029 2012-03-12 16:42:58