Skip to content

Instantly share code, notes, and snippets.

@holysugar
Created December 21, 2012 04:59
Show Gist options
  • Select an option

  • Save holysugar/4350714 to your computer and use it in GitHub Desktop.

Select an option

Save holysugar/4350714 to your computer and use it in GitHub Desktop.
struct_module.rb
# coding: utf-8
require "struct_module/version"
module StructModule
class << self
def generate_module(attrs)
Module.new{|mod|
@_members = attrs
def self.included(base)
# XXX 手抜き感ある
base.class_eval <<-END
attr_accessor #{StructModule.args_to_symbollist(@_members)}
def initialize(#{StructModule.args_to_argstring(@_members)})
#{StructModule.args_to_assignstring(@_members)}
end
def self.members
[#{StructModule.args_to_symbollist(@_members)}]
end
END
end
}
end
def args_to_symbollist(args)
args.map{|name| ":#{name}"}.join(', ')
end
def args_to_argstring(args)
args.map{|name| "#{name} = nil"}.join(', ')
end
def args_to_assignstring(args)
args.map{|name| "@#{name} = #{name}"}.join('; ')
end
end
end
def StructModule(*args)
StructModule.generate_module(args)
end
__END__
# sample
class C
include StruceModule(:foo, :bar)
end
c = C.new #=> #<C:0x007ff22a3acf68 @bar=nil, @foo=nil>
c.foo #=> nil
c.foo = 1 #=> 1
c.foo #=> 1
c2 = C.new(2, 3) #=> #<C:0x007ff22a4044c0 @bar=3, @foo=2>
c2.bar = 4 #=> 4
C.members #=> [:foo, :bar]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment