在Ruby的文档的dup说:
在一般情况下,
clone并dup可能在派生类不同的语义.虽然clone用于复制对象(包括其内部状态),但dup通常使用后代对象的类来创建新实例.
但是当我做一些测试时,我发现它们实际上是相同的:
class Test
attr_accessor :x
end
x = Test.new
x.x = 7
y = x.dup
z = x.clone
y.x => 7
z.x => 7
Run Code Online (Sandbox Code Playgroud)
那么这两种方法有什么区别?
我想跟踪一些任意命名的字符串的计数,然后将计数重置为零.我的想法是做以下事情:
reset_hash={"string1"=>0,"string2"=>0,"string3"=>0}
=> {"string1"=>0, "string2"=>0, "string3"=>0}
new_hash = reset_hash
=> {"string1"=>0, "string2"=>0, "string3"=>0}
new_hash["string1"]=1
new_hash["string3"]=1
new_hash
=> {"string1"=>1, "string2"=>0, "string3"=>1}
Run Code Online (Sandbox Code Playgroud)
...
现在我想将new_hash重置为reset_hash:
new_hash = reset_hash
=> {"string1"=>1, "string2"=>0, "string3"=>1}
reset_hash
=> {"string1"=>1, "string2"=>0, "string3"=>1}
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?似乎reset_hash实际上已设置为new_hash,这与我想要的相反.如何实现所需的行为?
当我运行下面的ruby代码时,为什么我的数组被全局操作?我怎样才能在函数范围内操作数组?
a = [[1,0],[1,1]]
def hasRowsWithOnlyOnes(array)
array.map { |row|
return true if row.keep_if{|i| i != 1 } == []
}
false;
end
puts a.to_s
puts hasRowsWithOnlyOnes(a)
puts a.to_s
Run Code Online (Sandbox Code Playgroud)
$ ruby test.rb 输出:
[[1, 0], [1, 1]]
true
[[0], []]
Run Code Online (Sandbox Code Playgroud)
我无法让它发挥作用.我甚至试过.select{true}把它分配给一个新名字.范围如何在Ruby for Arrays中运行?仅供参考$ ruby -v:
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]
Run Code Online (Sandbox Code Playgroud) 为什么data_dummy哈希中的值会增加?我想用它来启动零值的另一个哈希!
fau[f.label][:hash] = data_dummy # ==>{"name 1" => 0, "name 2" => 0} but in the second loop it contains data from the first loop e.g. {"name 1" => 2, "name 2" => 0}
Run Code Online (Sandbox Code Playgroud)
当使用字符串而不是变量dummy_data时,代码按预期工作.
fau[f.label][:hash] = {"name 1" => 0, "name 2" => 0}
Run Code Online (Sandbox Code Playgroud)
我不能这样做因为'名字X'正在改变......
这对我来说很奇怪!
完整的代码
fau = {}
series = []
labels = [{:value => 0, :text => ''}]
data_dummy = {}
source.each do |c|
data_dummy[c.name] = 0
end
i = 0
data_dummy.each do |k,v|
i += …Run Code Online (Sandbox Code Playgroud) a哈希.s是一个数组,我想a迭代地推送哈希.我们的想法是独立地保留每个迭代推送的哈希值.这是我试过的.
a = {:a=> 1, :b=>2}
s = []
s << a
s << a # => [{:b=>2, :a=>1}, {:b=>2, :a=>1}]
a[:b] = 3
s # => [{:b=>3, :a=>1}, {:b=>3, :a=>1}]
t = []
t.push(a) # => [{:b=>3, :a=>1}]
t.push(a) # => [{:b=>3, :a=>1}, {:b=>3, :a=>1}]
a[:b] = 4
t # => [{:b=>4, :a=>1}, {:b=>4, :a=>1}]
Run Code Online (Sandbox Code Playgroud)
上面没有给出解决方案:更改a更改先前推送的数组内元素中的值.推后a到s两次,我改变了a[:b]从2到3,所有的元素体现了变化.请给我这个建议.