Skip to content

Instantly share code, notes, and snippets.

@amorphid
Last active September 28, 2018 16:34
Show Gist options
  • Save amorphid/e66ca769e099d4447d0afdaf91cf0a45 to your computer and use it in GitHub Desktop.
Save amorphid/e66ca769e099d4447d0afdaf91cf0a45 to your computer and use it in GitHub Desktop.
Ruby refinement example
#!/usr/bin/env ruby
# here's a good blog post on Refinements => https://blog.codeship.com/ruby-refinements/
# here's some Ruby documentation on Refinements => https://ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html
class Foo < Struct.new(:bar)
end
module FooTools
refine Foo do
def baz
puts "hey look a baz!"
end
end
end
class SomeClass
using FooTools
def call_baz(foo)
foo.baz
end
end
f = Foo.new("bar")
begin
f.baz
rescue
puts "no baz :("
end
SomeClass.new.call_baz(f)
begin
f.baz
rescue
puts "no baz :("
end
# irb(main):001:0> #!/usr/bin/env ruby
# => nil
# irb(main):002:0>
# irb(main):003:0> class Foo < Struct.new(:bar)
# irb(main):004:1> end
# => nil
# irb(main):005:0>
# irb(main):006:0> module FooTools
# irb(main):007:1> refine Foo do
# irb(main):008:2* def baz
# irb(main):009:3> puts "hey look a baz!"
# irb(main):010:3> end
# irb(main):011:2> end
# irb(main):012:1> end
# => #<refinement:Foo@FooTools>
# irb(main):013:0>
# irb(main):014:0> class SomeClass
# irb(main):015:1> using FooTools
# irb(main):016:1>
# irb(main):017:1> def call_baz(foo)
# irb(main):018:2> foo.baz
# irb(main):019:2> end
# irb(main):020:1> end
# => :call_baz
# irb(main):021:0>
# irb(main):022:0> f = Foo.new("bar")
# => #<struct Foo bar="bar">
# irb(main):023:0>
# irb(main):024:0> begin
# irb(main):025:1> f.baz
# irb(main):026:1> rescue
# irb(main):027:1> puts "no baz :("
# irb(main):028:1> end
# no baz :(
# => nil
# irb(main):029:0>
# irb(main):030:0> SomeClass.new.call_baz(f)
# hey look a baz!
# => nil
# irb(main):031:0>
# irb(main):032:0> begin
# irb(main):033:1> f.baz
# irb(main):034:1> rescue
# irb(main):035:1> puts "no baz :("
# irb(main):036:1> end
# no baz :(
# => nil
# irb(main):037:0>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment