読者です 読者をやめる 読者になる 読者になる

class Creature
  # Get a metaclass for this class
  def Creature.metaclass
    class << Creature
      self
    end
  end
  # Get NG metaclass for this class
  def Creature.metaclass_ng
    self
  end
p metaclass
p metaclass_ng

これの実行結果は…

irb(main):001:0> require 'creature2'
#
Creature
=> true
irb(main):002:0> 

う〜〜〜ん。

    class << Creature
      self
    end

がわからんなぁ…

む。とりあえず放置!

青木峰郎さんの添削の例を使いこなしていく方向に転換(Rubyist Magazine - あなたの Ruby コードを添削します 【第 2 回】 HexStruct.rb)のコピペ。

class HexStruct
  class << self
    def define(&block)
      new_class(&block)
    end

    def fixed_size_field(name, byte_size)
      define_field name, FixedSizeField.new(nil, byte_size)
    end

    def variable_size_field(name)
      define_field name, VariableSizeField.new(nil)
    end

    def struct_field(name, &block)
      c = new_class(&block)
      define_field name, StructField.new(nil, c)
      c
    end

    def list_field(name, &block)
      c = new_class(&block)
      define_field name, ListField.new([], c)
      c
    end

private

    def new_class(&block)
      c = Class.new(::HexStruct)
      c.instance_variable_set :@field_specs, []
      c.module_eval(&block)
      c
    end

    def define_field(name, prototype)
      @field_specs.push [name.to_s.intern, prototype]
      define_field_accessor name
    end
  end

  def define_field_accessor(name)
    define_method(name) {
      self[name].value
    }
    define_method("#{name}=") {|obj|
      self[name].value = obj
    }
  end
end

自分を継承させたクラスでmodule_evalを実行させるところが、ポイントなのだろうが、理解が追い付かん…

こう呼ぶ
 FixedSizeFrame = HexStruct.define {
   fixed_size_field :MsgCode, 2
   fixed_size_field :from_add, 3
   fixed_size_field :to_add, 3
   variable_size_field :data
 }