2012-03-12 11 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をパラメータとして渡すだけの理由はありますか? –

+0

実際には、救助活動の仕組みを知りたいだけです。:-) – christianblais

+0

これは構文構文です。これはlex/parseプロセスの一部です。言語を変更する必要があります。 –

答えて

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構文と「という名前のパラメータ」の構文は同じように見えますが、すべての彼ら一般的に=>演算子があります。最初のケースでは、rescue に変数eを「入れる」ように指示し、効果的にそれをその変数に格納します。 2番目のケースでは、Rubyに、メソッドに渡されたすべてのパラメータを収集し、提供されたキーと値のペアを使用してハッシュに格納するように指示します。効果的にはMyClassparamsハッシュにキー:classの下に格納しています。
  • 上記の例では、to_sの定義は、インスタンスメソッドとして定義したため、MyClass自体で呼び出すことはできません。インスタンスメソッドは、クラスの「インスタンス」をinst = MyClass.newで作成した場合にのみ使用できます。その後、inst.to_sに電話をかけることができます。クラスを事物の抽象的な「タイプ」と考え、そのインスタンスをそのタイプの具体的なものとして考えてください。インスタンスではなくクラスでメソッドを使用できるようにするには、接頭辞としてself.を付ける必要があります。上の2つの異なる構文を示しました。
  • この例でも、def MyClassを使用しています。これはRubyが「MyClassという名前のメソッドを定義する」と解釈します。クラスを定義する場合は、代わりにclass MyClassを使用する必要があります。

これは少し物事を明確にします。

+0

あなたが言ったこと、つまり「最初のケースでは、例外を救済しようとしています」を「変数eに効果的に格納する」ということに基づいて、まったく同じ機能を再現できますか? – christianblais

+0

他の人がコメントしたように、いいえ、これは不可能です。これは、メソッドパラメータ(通常の名前または「名前付き」)が使用するものです。メソッド定義内で定義されていないパラメータに依存するメソッドを持つことは、問題を求めています。私はそれがなぜそれをサポートする言語を知らないのかと思う:-) – user2398029