#529: Using a Proc as a ‘callback function’ -------------------------------------+-------------------------------------- Reporter: eloy.de.enige@… | Owner: martinlagardette@… Type: defect | Status: closed Priority: blocker | Milestone: MacRuby 0.6 Component: MacRuby | Resolution: fixed Keywords: | -------------------------------------+-------------------------------------- Changes (by martinlagardette@…): * cc: eloy.de.enige@… (added) * status: assigned => closed * resolution: => fixed * milestone: => MacRuby 0.6 Old description:
Some Cocoa methods, or C functions, take pointers to functions which can be used as callbacks. For instance, FSEventStreamCreate: http://bit.ly/8p70Yw.
RubyCocoa, in conjunction with BridgeSupport, supported this by allowing the user to give a proc that would be used as the callback. MacRuby should support this too.
Here's a spec example:
{{{ describe "BridgeSupport" do it "bridges a proc to be used where a pointer to a callback function is required" do array = [5, 3, 2, 4, 1] proc = Proc.new do |x, y, context_pointer| context = context_pointer[0].chr + context_pointer[1].chr + context_pointer[2].chr x <=> y if context == 'foo' end
array.sortUsingFunction(proc, context: 'bar') array.should == [5, 3, 2, 4, 1]
array.sortUsingFunction(proc, context: 'foo') array.should == [1, 2, 3, 4, 5] end end }}}
Don't know if this is feasible, but it would be great if the arguments given to the proc, like the context argument, were no Pointer objects, but the object they actually point to:
{{{ describe "BridgeSupport" do it "bridges a proc to be used where a pointer to a callback function is required" do array = [5, 3, 2, 4, 1] proc = Proc.new do |x, y, context| x <=> y if context == 'foo' end
array.sortUsingFunction(proc, context: 'bar') array.should == [5, 3, 2, 4, 1]
array.sortUsingFunction(proc, context: 'foo') array.should == [1, 2, 3, 4, 5] end end }}}
New description: Some Cocoa methods, or C functions, take pointers to functions which can be used as callbacks. For instance, FSEventStreamCreate: http://bit.ly/8p70Yw. RubyCocoa, in conjunction with BridgeSupport, supported this by allowing the user to give a proc that would be used as the callback. MacRuby should support this too. Here's a spec example: {{{ #!ruby describe "BridgeSupport" do it "bridges a proc to be used where a pointer to a callback function is required" do array = [5, 3, 2, 4, 1] proc = Proc.new do |x, y, context_pointer| context = context_pointer[0].chr + context_pointer[1].chr + context_pointer[2].chr x <=> y if context == 'foo' end array.sortUsingFunction(proc, context: 'bar') array.should == [5, 3, 2, 4, 1] array.sortUsingFunction(proc, context: 'foo') array.should == [1, 2, 3, 4, 5] end end }}} Don't know if this is feasible, but it would be great if the arguments given to the proc, like the context argument, were no Pointer objects, but the object they actually point to: {{{ #!ruby describe "BridgeSupport" do it "bridges a proc to be used where a pointer to a callback function is required" do array = [5, 3, 2, 4, 1] proc = Proc.new do |x, y, context| x <=> y if context == 'foo' end array.sortUsingFunction(proc, context: 'bar') array.should == [5, 3, 2, 4, 1] array.sortUsingFunction(proc, context: 'foo') array.should == [1, 2, 3, 4, 5] end end }}} -- Comment: Implemented with r3847 :-) {{{ #!ruby framework 'Foundation' array = [1, 42, 6, 2, 3] proc = Proc.new { |a, b, _| a <=> b } array.sortedArrayUsingFunction(proc, context: nil) # [1, 2, 3, 6, 42] }}} -- Ticket URL: <http://www.macruby.org/trac/ticket/529#comment:5> MacRuby <http://macruby.org/>