2017-07-10 5 views
1

プロパティを持ち、関数呼び出しの表記だけを使って呼び出すことができるオブジェクトを作成する方法はありますか? Pythonの__call__に相当するもの。例えばオブジェクトを呼び出し可能にするにはどうしたらいいですか?

obj = ExampleClass.new() 
obj() # call notation 

代替アプローチは歓迎され、私は独自のプロパティを格納するための呼び出し可能な「オブジェクト」のための方法が必要です。

私がしようとしているのは、変数に呼び出し可能な "オブジェクト"を格納することです。このオブジェクトはそれに関連付けられたプロパティを持ちますが、同時にメソッドと同じように使用できます。括弧は、オプションと、それゆえであるため、

+1

私は気付いていません(そうするための大きなユースケースはないと思います)。特定の用途を解決しようとしていますか?より良いアプローチがあるかもしれません。 –

+0

"関数とまったく同じように使うことができます" - ルビには関数(例えばjavascriptのような種類)はありません。 –

答えて

1

希望の構文を少し変更することが喜んでいる場合は...

class Foo 
    def call 
    puts 'called' 
    end 
end 

f = Foo.new 
f.() 
# >> called 

正確な構文は、あなたの質問のように、、、ルビーでは不可能ですf()fと同じです。これは、呼び出し可能なオブジェクトの場合、あいまいです。呼び出しを実行するか、呼び出し可能なオブジェクトのみを参照しますか?明示的な呼び出し(ドット構文で)はあいまいさを取り除きます。

2

あなたは私の知る限りそれはメソッド呼び出しのために予約だけど、あなたは別の表記を使用してハックのビットでそれを行うことができますように、オブジェクトが呼び出し可能にすることはできません。

class ExampleClass 
    def [] 
    :callable 
    end 
end 

を行うことができます。

example = ExampleClass.new 
example[] 

これは、あなたがPROCを呼び出すことができる方法と似ています

proc = Proc.new { :return_value } 
proc[] 
# => :return_value 

それはn個です完璧ですが、うまくいくでしょう。

通常、これらの制限を回避してAPIを構築することで、この混乱の多くを補うことができます。

関連する問題