Skip to content

Instantly share code, notes, and snippets.

@satoryu
Last active October 19, 2019 05:20
Show Gist options
  • Save satoryu/3781049732714bf87e96e4faafd1c449 to your computer and use it in GitHub Desktop.
Save satoryu/3781049732714bf87e96e4faafd1c449 to your computer and use it in GitHub Desktop.
module Hoge
class ArrayBase
class << self
attr_accessor :type
end
def type
self.class.type
end
def initialize(values = [])
@values = values.map { |v| type.new(v) }
end
def values
@values
end
def values=(new_values)
new_values.map { |v| type.new(v) }
end
end
def Array(type)
klass = Class.new(Hoge::ArrayBase)
klass.type = type
klass
end
module_function :Array
class Foo
attr_reader :value
def initialize(value)
@value = value
end
def to_s
"Foo(v=#{value})"
end
end
class Bar
attr_reader :value
def initialize(value)
@value = value
end
def to_s
"Bar(v=#{value})"
end
end
end
puts Hoge::Array(Hoge::Foo).new(%w(1 2 3)).values
puts Hoge::Array(Hoge::Bar).new(%w(1 2 3)).values
@satoryu
Copy link
Author

satoryu commented Oct 19, 2019

$ ruby  dynamical_class_define.rb
Foo(v=1)
Foo(v=2)
Foo(v=3)
Bar(v=1)
Bar(v=2)
Bar(v=3)

💮

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment