尝试通过Ruby创建我自己的结构
我无法继承结构。我必须实现类似于Struct的类。 有没有办法改进我的代码以使用“ClassName”和类似Struct的函数?写k=Dave.new(“Rachel”,“Greene”)尝试通过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,以设置所有值
你看过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=
就足够了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"