Skip to content

Instantly share code, notes, and snippets.

@jonmagic
Last active August 29, 2015 14:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jonmagic/050c3a3b7cc7fa5e26e5 to your computer and use it in GitHub Desktop.
Save jonmagic/050c3a3b7cc7fa5e26e5 to your computer and use it in GitHub Desktop.
Callbacks in Ruby
irb(main):001:0> class Foo
irb(main):002:1> def set_callback(&block)
irb(main):003:2> @callback = block
irb(main):004:2> end
irb(main):005:1>
irb(main):006:1* def run
irb(main):007:2> 10.times do |n|
irb(main):008:3* @callback.call(n) if @callback
irb(main):009:3> end
irb(main):010:2>
irb(main):011:2* puts "complete"
irb(main):012:2> end
irb(main):013:1> end
=> :run
irb(main):015:0> f = Foo.new
=> #<Foo:0x007fde7b9f3da8>
irb(main):016:0> f.run
complete
=> nil
irb(main):017:0> f.set_callback {|n| puts n }
=> #<Proc:0x007fde7b9e8408@(irb):17>
irb(main):018:0> f.run
0
1
2
3
4
5
6
7
8
9
complete
=> nil
irb(main):019:0> class Bar
irb(main):020:1> def run
irb(main):021:2> message = "hello world"
irb(main):022:2> foo.set_callback { |n| puts "#{message} #{n}" }
irb(main):023:2> foo.run
irb(main):024:2> end
irb(main):025:1>
irb(main):026:1* def foo
irb(main):027:2> @foo ||= Foo.new
irb(main):028:2> end
irb(main):029:1> end
=> :foo
irb(main):030:0> b = Bar.new
=> #<Bar:0x007fde7ab237b0>
irb(main):031:0> b.run
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9
complete
=> nil
irb(main):001:0> class Foo
irb(main):002:1> attr_accessor :callback
irb(main):003:1>
irb(main):004:1* def run
irb(main):005:2> 10.times do |n|
irb(main):006:3* callback.call(n) if callback
irb(main):007:3> end
irb(main):008:2>
irb(main):009:2* puts "complete"
irb(main):010:2> end
irb(main):011:1> end
=> :run
irb(main):012:0>
irb(main):013:0* class Bar
irb(main):014:1> def run
irb(main):015:2> foo.callback = method(:tick)
irb(main):016:2> foo.run
irb(main):017:2> end
irb(main):018:1>
irb(main):019:1* def tick(n)
irb(main):020:2> message = "hello world"
irb(main):021:2> puts "#{message} #{n}"
irb(main):022:2> end
irb(main):023:1>
irb(main):024:1* def foo
irb(main):025:2> @foo ||= Foo.new
irb(main):026:2> end
irb(main):027:1> end
=> :foo
irb(main):028:0> b = Bar.new
=> #<Bar:0x007ff74d338488>
irb(main):029:0> b.run
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9
complete
=> nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment