(Crossposting note:1週間前にRuby Forumに質問しましたが、まだ回答がありませんでした)。ここで(単項)Procオブジェクトにパラメータをバインドすることはできますか?
私がこれまで持っているものの(非常に)単純化し、作業バージョンです:Tが構築される方法に応じて、T番号の呼び出しは、どちらか を呼び出すS#s_method1、この例では
# A class S with two methods, one which requires one parameter, and
# one without parameters.
class S
def initialize(s); @ms = s; end
def s_method1(i); puts "s_method1 #{i} #{@ms}"; end
def s_method2; puts "s_method2 #{@ms}"; end
end
# A class T which uses S, and "associates" itself to
# one of the both methods in S, depending on how it is
# initialized.
class T
def initialize(s, choice=nil)
@s = S.new(s)
# If choice is true, associate to the one-parameter-method, otherwise
# to the parameterless method.
@pobj = choice ? lambda { @s.s_method1(choice) } : @s.method(:s_method2)
end
# Here is how I use this association
def invoke
@pobj.call
end
end
またはS#S_method2を呼び出しますが、 S#s_method1を呼び出す場合、sオブジェクトのパラメータは、Tオブジェクトの時刻 の作成時にすでに固定されています。このため、2行以下、
T.new('no arguments').invoke
T.new('one argument', 12345).invoke
は私が必要とする正確に何である出力
s_method2 no arguments
s_method1 12345 one argument
を作り出します。私の質問に今
:私は パラメータのないメソッドs_method2
を呼び出したい場合には
、choice
はゼロである、つまり、私は エレガントな方法によってで私の呼び出し可能オブジェクトを取得することができますchoice
がゼロ非あり、Iはconstruにあった場合に
@s.method(:s_method2)
ct a Proc
オブジェクト 「ラムダ」を使用しています。これは不器用に見えるだけでなく、少しでも気分が良くなります 不快です。ここでは、initializeメソッド内の 環境に接続されているクロージャがありますが、この が状況によってはメモリリークを引き起こす原因になるかどうかはわかりません。
は、単純に固定された引数にメソッドオブジェクト(この場合は @s.method(:s_method1)
をバインドする簡単な方法はありますか?
私の最初のアイデアは
@s.method(:s_method1).curry[choice]
を使用していたが、これは実現しません私の目標は呼び出し可能なProc
オブジェクトを返しませんが、実際にはs_method1
を実行します(これはバグではありませんが、文書化された動作です)。
私の目標達成のための他のアイデアはありますか?
そこにあなたのラムダ、それは貧しい男のカリン__is__です。 –
私は知っている、と私はまた、いくつかの豊かな男のカリングが利用できることを望んでいた;-) – user1934428
私の頭の上に、私はあなたがルビーで得ることができる最高だと思う。 –