summaryrefslogtreecommitdiffhomepage
path: root/ruby.html.markdown
diff options
context:
space:
mode:
authorAdam Bard <github@adambard.com>2013-09-08 21:41:00 -0700
committerAdam Bard <github@adambard.com>2013-09-08 21:41:00 -0700
commitcae8dd6c660700893921cb63cdfcac59b8f84c07 (patch)
treebce05652a996ad6b84423bc9be262071b47eb55b /ruby.html.markdown
parent9d0465cc50fd9577b9e4489f161474e1aeb93295 (diff)
parent9cc1982c484e99adfb922733cb9c0fb5768b6a77 (diff)
Merge pull request #331 from warmwaffles/ruby-modules
Added module extension and inclusion examples
Diffstat (limited to 'ruby.html.markdown')
-rw-r--r--ruby.html.markdown51
1 files changed, 51 insertions, 0 deletions
diff --git a/ruby.html.markdown b/ruby.html.markdown
index 80682682..b9ba83cb 100644
--- a/ruby.html.markdown
+++ b/ruby.html.markdown
@@ -403,4 +403,55 @@ end
Human.bar # 0
Doctor.bar # nil
+module ModuleExample
+ def foo
+ 'foo'
+ end
+end
+
+# Including modules binds the methods to the object instance
+# Extending modules binds the methods to the class instance
+
+class Person
+ include ModuleExample
+end
+
+class Book
+ extend ModuleExample
+end
+
+Person.foo # => NoMethodError: undefined method `foo' for Person:Class
+Person.new.foo # => 'foo'
+Book.foo # => 'foo'
+Book.new.foo # => NoMethodError: undefined method `foo'
+
+# Callbacks when including and extending a module are executed
+
+module ConcernExample
+ def self.included(base)
+ base.extend(ClassMethods)
+ base.send(:include, InstanceMethods)
+ end
+
+ module ClassMethods
+ def bar
+ 'bar'
+ end
+ end
+
+ module InstanceMethods
+ def qux
+ 'qux'
+ end
+ end
+end
+
+class Something
+ include ConcernExample
+end
+
+Something.bar # => 'bar'
+Something.qux # => NoMethodError: undefined method `qux'
+Something.new.bar # => NoMethodError: undefined method `bar'
+Something.new.qux # => 'qux'
```