Difference between revisions of "Metaprogramming in Ruby"
Jump to navigation
Jump to search
PeterHarding (talk | contribs) |
PeterHarding (talk | contribs) |
||
(3 intermediate revisions by the same user not shown) | |||
Line 9: | Line 9: | ||
def my_attr_accessor(name) | def my_attr_accessor(name) | ||
ivar_name = "@#{name}" | |||
STDERR.print "#{name}\n" | STDERR.print "#{name}\n" | ||
define_method(name) do | define_method(name) do | ||
Line 43: | Line 42: | ||
puts ex.tst | puts ex.tst | ||
</pre> | </pre> | ||
Output | |||
<pre> | |||
$ ./meta.rb | |||
var | |||
tst | |||
Set var = 99 | |||
Get var | |||
99 | |||
Set tst = 2 | |||
Get tst | |||
2 | |||
</pre> | |||
[[Category:Ruby]] | [[Category:Ruby]] | ||
[[Category:Examples]] | [[Category:Examples]] | ||
[[ | [[Category:Metaprogramming]] |
Latest revision as of 10:20, 30 July 2012
Reimplement attr_accessor
#!/usr/bin/env ruby module Accessor def my_attr_accessor(name) ivar_name = "@#{name}" STDERR.print "#{name}\n" define_method(name) do STDERR.print "Get #{name}\n" instance_variable_get(ivar_name) end define_method("#{name}=") do |val| STDERR.print "Set #{name} = #{val}\n" instance_variable_set(ivar_name, val) end end end class Example extend Accessor my_attr_accessor :var my_attr_accessor :tst end ex = Example.new ex.var = 99 puts ex.var ex.tst = 2 puts ex.tst
Output
$ ./meta.rb var tst Set var = 99 Get var 99 Set tst = 2 Get tst 2