Ruby struct reset方法

时间:2016-03-16 13:15:33

标签: ruby object struct

我有一个大型结构,在创建一个对象并将一些成员设置为值之后,我希望能够将该对象的所有成员设置为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

我预计最后一次回归""但它返回"值"。我做错了什么?除了每次都要销毁和重新创建对象之外,还有一种原生方法吗?

5 个答案:

答案 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

更新:我不得不更改代码。以下评论是对的。现在它正在运作