{"id":67,"date":"2008-03-02T11:21:37","date_gmt":"2008-03-02T19:21:37","guid":{"rendered":"http:\/\/fernyb.net\/blog\/2008\/03\/02\/ruby-technique-meta-programming\/"},"modified":"2008-03-02T11:21:37","modified_gmt":"2008-03-02T19:21:37","slug":"ruby-technique-meta-programming","status":"publish","type":"post","link":"http:\/\/fernyb.net\/blog\/2008\/03\/02\/ruby-technique-meta-programming\/","title":{"rendered":"Ruby Technique: Meta Programming"},"content":{"rendered":"<p>\nMeta Programming is code that writes code. See the code sample below.<br \/>\nI have made a screencast of this process. <a href=\"http:\/\/fernyb.net\/mov-video\/meta_programming.mov\" target=\"_blank\">View it here<\/a>\n<\/p>\n<div id=\"code_body\">\n<div class=\"ruby\">\n<pre><span class=\"comment\">#!\/usr\/bin\/env ruby<\/span>\r\n\r\n<span class=\"keyword\">class <\/span><span class=\"class\">Product<\/span>\r\n  <span class=\"keyword\">def <\/span><span class=\"method\">initialize<\/span><span class=\"punct\">(<\/span><span class=\"ident\">items<\/span><span class=\"punct\">)<\/span>\r\n    <span class=\"ident\">items<\/span><span class=\"punct\">.<\/span><span class=\"ident\">each<\/span> <span class=\"punct\">{|<\/span><span class=\"ident\">item<\/span><span class=\"punct\">|<\/span> <span class=\"constant\">Product<\/span><span class=\"punct\">.<\/span><span class=\"ident\">product<\/span><span class=\"punct\">(<\/span><span class=\"ident\">item<\/span><span class=\"punct\">)<\/span> <span class=\"punct\">}<\/span>\r\n  <span class=\"keyword\">end<\/span>\r\n\r\n  <span class=\"keyword\">def <\/span><span class=\"method\">self.product<\/span><span class=\"punct\">(<\/span><span class=\"ident\">item<\/span><span class=\"punct\">)<\/span>\r\n    <span class=\"ident\">code<\/span> <span class=\"punct\">=<\/span> <span class=\"punct\">%Q{<\/span><span class=\"string\">\r\n      def add_<span class=\"expr\">#{item}<\/span>(item)\r\n        @<span class=\"expr\">#{item}<\/span> = [] unless @<span class=\"expr\">#{item}<\/span>\r\n        @<span class=\"expr\">#{item}<\/span> &lt;&lt; item\r\n      end\r\n\r\n      def display_<span class=\"expr\">#{item}<\/span>s\r\n        @<span class=\"expr\">#{item}<\/span>.each {|item| puts item <\/span><span class=\"punct\">}<\/span>\r\n      <span class=\"keyword\">end<\/span>\r\n    <span class=\"punct\">}<\/span>\r\n    <span class=\"ident\">class_eval<\/span><span class=\"punct\">(<\/span><span class=\"ident\">code<\/span><span class=\"punct\">)<\/span>\r\n  <span class=\"keyword\">end<\/span>\r\n<span class=\"keyword\">end<\/span>\r\n\r\n<span class=\"keyword\">class <\/span><span class=\"class\">Item<\/span> <span class=\"punct\">&lt;<\/span> <span class=\"constant\">Product<\/span>\r\n  <span class=\"keyword\">def <\/span><span class=\"method\">initialize<\/span><span class=\"punct\">(*<\/span><span class=\"ident\">items<\/span><span class=\"punct\">)<\/span>\r\n    <span class=\"keyword\">super<\/span><span class=\"punct\">(<\/span><span class=\"ident\">items<\/span><span class=\"punct\">)<\/span>\r\n  <span class=\"keyword\">end<\/span>\r\n<span class=\"keyword\">end<\/span>\r\n\r\n<span class=\"ident\">cart<\/span> <span class=\"punct\">=<\/span> <span class=\"constant\">Item<\/span><span class=\"punct\">.<\/span><span class=\"ident\">new<\/span><span class=\"punct\">(<\/span><span class=\"symbol\">:book<\/span><span class=\"punct\">,<\/span> <span class=\"symbol\">:computer<\/span><span class=\"punct\">,<\/span> <span class=\"symbol\">:music<\/span><span class=\"punct\">)<\/span>\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">add_book<\/span><span class=\"punct\">(<\/span><span class=\"symbol\">:Ruby<\/span><span class=\"punct\">)<\/span> <span class=\"comment\"># =&gt; Add a book to our cart items<\/span>\r\n\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">display_books<\/span> <span class=\"comment\"># =&gt; We want to display All books we have added<\/span>\r\n<span class=\"ident\">puts<\/span> <span class=\"punct\">&quot;<\/span><span class=\"string\"><span class=\"escape\">\\n<\/span><\/span><span class=\"punct\">&quot;<\/span>\r\n\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">add_computer<\/span><span class=\"punct\">(<\/span><span class=\"symbol\">:Apple<\/span><span class=\"punct\">)<\/span>\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">add_computer<\/span><span class=\"punct\">(<\/span><span class=\"symbol\">:Dell<\/span><span class=\"punct\">)<\/span>\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">add_computer<\/span><span class=\"punct\">(<\/span><span class=\"symbol\">:Sony<\/span><span class=\"punct\">)<\/span>\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">display_computers<\/span> <span class=\"comment\"># =&gt; Display All Computers<\/span>\r\n<span class=\"ident\">puts<\/span> <span class=\"punct\">&quot;<\/span><span class=\"string\"><span class=\"escape\">\\n<\/span><\/span><span class=\"punct\">&quot;<\/span>\r\n\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">add_music<\/span><span class=\"punct\">(&#8217;<\/span><span class=\"string\">Modest Mouse<\/span><span class=\"punct\">&#8216;)<\/span>\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">add_music<\/span><span class=\"punct\">(&#8217;<\/span><span class=\"string\">Northstar<\/span><span class=\"punct\">&#8216;)<\/span>\r\n<span class=\"ident\">cart<\/span><span class=\"punct\">.<\/span><span class=\"ident\">display_musics<\/span> <span class=\"comment\"># =&gt; Display All Music Items<\/span>\r\n<\/pre>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Meta Programming is code that writes code. See the code sample below. I have made a screencast of this process. View it here #!\/usr\/bin\/env ruby class Product def initialize(items) items.each {|item| Product.product(item) } end def self.product(item) code = %Q{ def add_#{item}(item) @#{item} = [] unless @#{item} @#{item} &lt;&lt; item end def display_#{item}s @#{item}.each {|item| puts [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3,21],"tags":[],"_links":{"self":[{"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/posts\/67"}],"collection":[{"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/comments?post=67"}],"version-history":[{"count":0,"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/posts\/67\/revisions"}],"wp:attachment":[{"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/media?parent=67"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/categories?post=67"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/fernyb.net\/blog\/wp-json\/wp\/v2\/tags?post=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}