尝试通过Ruby创建我自己的结构

尝试通过Ruby创建我自己的结构,ruby,struct,metaprogramming,Ruby,Struct,Metaprogramming,我无法继承结构。我必须实现类似于Struct的类。 有没有办法改进我的代码以使用“ClassName”和类似Struct的函数?写k=Dave.new(“Rachel”,“Greene”) 你看过Ruby中的Struct类吗 class MyStruct # k、 名字 #=>“瑞秋” k、 姓 #=>“绿色” 您不需要在方法内部设置常量-Dave=就足够了 我在这里为每个属性创建一个getter和setter 在initialize方法中,我将每个值发送到相应的setter,以设置所有值

我无法继承结构。我必须实现类似于Struct的类。 有没有办法改进我的代码以使用“ClassName”和类似Struct的函数?写k=Dave.new(“Rachel”,“Greene”)


你看过Ruby中的Struct类吗

class MyStruct

此外,您不应该覆盖self.new,而应该定义initialize,这里有一个代码版本,它可以工作:

class MyStruct
  def self.new(*attributes)
    Class.new do
      self.send(:attr_accessor, *attributes)
      self.send(:define_method, :initialize) do |*values|
        values.each_with_index { |val, i| self.send("#{attributes[i]}=", val) }
      end  
    end
  end
end

Dave = MyStruct.new(:name, :surname)
k = Dave.new('Rachel', 'Green')
# => #<Dave:0x00000001af2b10 @name="Rachel", @surname="Green"> 
k.name
# => "Rachel"
k.surname
# => "Green"
类MyStruct
def self.new(*属性)
新办的
self.send(:attr\u访问器,*属性)
self.send(:define_method,:initialize)do |*值|
values.each_与_索引{val,i | self.send(“#{attributes[i]}=”,val)}
结束
结束
结束
结束
Dave=MyStruct.new(:name,:姓氏)
k=Dave.new('Rachel','Green'))
# => # 
k、 名字
#=>“瑞秋”
k、 姓
#=>“绿色”
  • 您不需要在方法内部设置常量-
    Dave=
    就足够了
  • 我在这里为每个属性创建一个getter和setter
  • initialize
    方法中,我将每个值发送到相应的setter,以设置所有值。如果值少于预期值,则不会设置最后一个属性,如果值更多,则会引发异常(
    未定义的方法“=”

  • 很抱歉,对于我的任务,我无法继承结构。我必须实现类似于Struct的类。难道“不应该”有点极端吗?例如,假设您想在一个类实例变量中编译一个类实例列表?我会将其视为类的作业,因此会将其放入
    new
    ,而不是让实例调用
    self.class.instance\u variable\u get…
    …在
    初始化中设置
    。哇!非常感谢你。祝你好运!对不起,打扰你了。为什么我不能写k[“name”]?一件小事:
    self.send
    可以写
    send
    class MyStruct < Struct.new(:first_name, :last_name)
    
    end
    
    MyClassObj = MyStruct.new("Gavin", "Morrice")
    
    class MyStruct
      def self.new(*attributes)
        Class.new do
          self.send(:attr_accessor, *attributes)
          self.send(:define_method, :initialize) do |*values|
            values.each_with_index { |val, i| self.send("#{attributes[i]}=", val) }
          end  
        end
      end
    end
    
    Dave = MyStruct.new(:name, :surname)
    k = Dave.new('Rachel', 'Green')
    # => #<Dave:0x00000001af2b10 @name="Rachel", @surname="Green"> 
    k.name
    # => "Rachel"
    k.surname
    # => "Green"