shonen.hateblo.jp

やったこと,しらべたことを書く.

Rubyで構造体のようなクラスを生成するメソッドを作成したら既にStructという名前で存在していた件

タイトルの通りです

Rubyで構造体のようなクラスを生成するメソッドを作ったのですが、 実は既にStructクラスというものがあり、作ったメソッドがほぼ無意味になってしまいました。

せっかくなので、供養。

def create_struct(props_name)
  k = Class.new()
  props = props_name.clone
  k.class_eval do
    define_method(:initialize) do |**args|
      props.each do |pr|
        instance_variable_set '@' + pr, args[pr.to_sym]
      end
    end
    attr_accessor *props
  end
  k
end

使い方。Struct 型でも全く同じ事できるよ

Chars = create_struct(['x', 'y', 'vx', 'vy', 'name'])

# c = Chars.new(10, 6, 0, 1)
d = Chars.new(x: 10, y: 6, vx: 0, vy: 1)

p d.x    # => 10
p d.y    # => 6
p d.name # => nil
d.name = 'Player'
p d.name # => 'Player'


Chars2 = Struct.new('Chars2', :x, :y, :vx, :vy, :name, keyword_init: true)

d = Chars2.new(x: 10, y: 6, vx: 0, vy: 1)

p d.x    # => 10
p d.y    # => 6
p d.name # => nil
d.name = 'Player'
p d.name # => 'Player'