我有一个大型结构,在创建一个对象并将一些成员设置为值之后,我希望能够将该对象的所有成员设置为nil。我尝试了以下内容,但由于某种原因,它无法正常工作:
My_struct = Struct.new(
:member1,
:member2,
:member3
) do
def reset
self.each {|x| x = nil }
end
end
myblock = My_struct.new
puts myblock.member1
myblock.member1 = "value"
puts myblock.member1
myblock.reset
puts myblock.member1
我预计最后一次回归""但它返回"值"。我做错了什么?除了每次都要销毁和重新创建对象之外,还有一种原生方法吗?
答案 0 :(得分:2)
self.each
遍历值,而不是结构的成员/键。这应该做你想要的。
My_struct = Struct.new(
:member1,
:member2,
:member3
) do
def reset
self.members.each {|k| send("#{k}=", nil)}
end
end
myblock = My_struct.new
myblock.member1
#=> nil
myblock.member1 = "value"
#=> "value"
myblock.member1
#=> "value"
myblock.reset
myblock.member1
#=> nil
答案 1 :(得分:2)
我有一个大型结构,在创建一个对象并将一些成员设置为值之后,我希望能够将该对象的所有成员设置为nil。
除非您特别需要保持对象ID相同,否则最简单的方法就是创建一个新的Struct,因为Struct#new的文档说:
取消设置参数默认为
nil
。
例如:
My_struct = Struct.new :member1, :member2, :member3
m = My_struct.new 'foo', 'bar', 'baz'
#=> #<struct My_struct member1="foo", member2="bar", member3="baz">
m = My_struct.new
#=> #<struct My_struct member1=nil, member2=nil, member3=nil>
显然,m.object_id
每次将新的My_struct实例分配给 m 时都会有所不同,但很少有用例会(或应该)重要。与尝试重新分配个人会员相比,它确实更容易且更不容易出错,但您的里程可能会有所不同。
答案 2 :(得分:1)
My_struct = Struct.new(:member1, :member2, :member3) do
def reset
initialize
end
end
myblock = My_struct.new
myblock.member1 = "value"
p myblock.object_id # => 15379000
myblock.reset
p myblock.member1 # => nil
p myblock.object_id # => 15379000; same object
答案 3 :(得分:0)
My_struct = Struct.new(
:member1,
:member2,
:member3
) do
def reset
members.each { |m| self[m] = nil }
end
end
m = My_struct.new #=> #<struct My_struct member1=nil, member2=nil, member3=nil>
m.member1 = "Billy-Bob"
m.member2 = "Girtie"
m.member3 = "Hector"
m.member1 #=> "Billy-Bob"
m.member2 #=> "Girtie"
m.member3 #=> "Hector"
m.reset
m.member1 #=> nil
m.member2 #=> nil
m.member3 #=> nil
答案 4 :(得分:-2)
我尝试过使用ruby 2.2.4。所有字段默认为零? 但我找到了一种可以改变你喜欢的领域的方法
require 'pp'
MyStruct = Struct.new( :member, :user, :parent ) do
def initialize
self.members.each { | elem | self.send( "#{elem}=", 1 ) }
end
end
pp MyStruct.new
更新:我不得不更改代码。以下评论是对的。现在它正在运作