我有一个值数组,当我打印哈希值时,我将其用作订单的参考.我想修改数组,以便数组值"更漂亮".我想我只是复制或克隆数组,更改值,原始对象将保持未被控制.但是(在irb中)......
@arr = ['stuff', 'things']
a = @arr.clone
b = @arr.dup
Run Code Online (Sandbox Code Playgroud)
所以,至少,a和@arr是不同的对象:
a.object_id == @arr.object_id
=> false
Run Code Online (Sandbox Code Playgroud)
但现在它变得奇怪了
a[0].capitalize!
a
=> ['Stuff', 'things']
@arr
=> ['Stuff', 'things'] ##<-what?
b
=> ['Stuff', 'things']## <-what???
Run Code Online (Sandbox Code Playgroud)
好的...所以修改一个会改变其他的,让我们改回来?
a[0] = 'stuff'
a
=> ['stuff', 'things']
@arr
=> ['Stuff', 'things'] ## <- WHAT?????
Run Code Online (Sandbox Code Playgroud)
为了完整性b [1].资本化!具有相同的效果,将所有三个阵列的第二个位置都大写
那么......大写结束时的爆炸会使它变得更加强大吗?足够交叉到其他对象?我知道其他方法,但这对我来说似乎非常奇怪.我认为这与"浅版"有关.建议最好的方法吗?
我正在研究一些在Ruby中深度复制对象的技术(MRI 1.9.3).
我遇到了以下示例,但我不确定#dup方法实现.我测试了它并且确实有效,但是我不理解该方法的逻辑步骤,因此我在自己的代码中使用它并不舒服.
是语句@name = @name.dup引用伊娃内的副本?怎么样?我看不出来.
请问有人解释一下吗?
还有,有更好的方法吗?
class MyClass
attr_accessor :name
def initialize(arg_str) # called on MyClass.new("string")
@name = arg_str # initialize an instance variable
end
def dup
the_copy = super # shallow copy calling Object.dup
@name = @name.dup # new copy of istance variable
return the_copy # return the copied object
end
end
Run Code Online (Sandbox Code Playgroud) 学习Ruby,我正在创建一个Battleship项目,我有以下代码作为我正在创建的类"Board"的实例方法.
def hidden_ships_grid
hidden_s_grid = @grid.dup
hidden_s_grid.each_with_index do |sub_array, i|
sub_array.each_with_index do |el, j|
# position = [i, j]
hidden_s_grid[i][j] = :N if el == :S
end
end
end
Run Code Online (Sandbox Code Playgroud)
基本上这个方法会创建一个@grid变量的另一个实例,它将用:N代替每个:S符号.
RSPEC有两个要求:1)"应该返回一个表示网格的2D数组,其中每个:S被替换为:N"和2)"不应该改变原始的@grid".
我的问题是我的上述代码满足第一个要求,但它打破了第二个要求.有人可以向我解释是什么原因导致原始的@grid文件发生变异?我已经完成了15次代码,我无法看到我重写或重新分配原始@grid变量的位置.
提供给我们的"正确"解决方案使用".map",这很好,但我想了解为什么这个解决方案不起作用并最终改变原始的@grid变量.
1) Board PART 2 #hidden_ships_grid should not mutate the original @grid
Failure/Error: expect(board.instance_variable_get(:@grid)).to eq([[:S, :N],[:X, :S]])
expected: [[:S, :N], [:X, :S]]
got: [[:N, :N], [:X, :N]]
(compared using ==)
Diff:
@@ -1,2 +1,2 @@
-[[:S, :N], [:X, :S]]
+[[:N, :N], [:X, :N]]
Run Code Online (Sandbox Code Playgroud)
提前致谢!
有没有办法按值传递对象而不是Ruby中的引用?例如,
class Person
attr_accessor :name
end
def get_name(obj)
obj.name = "Bob"
puts obj.name
end
jack = Person.new
jack.name = "Jack"
puts jack.name
get_name(jack)
puts jack.name
Run Code Online (Sandbox Code Playgroud)
输出应该是
Jack
Bob
Jack
Run Code Online (Sandbox Code Playgroud)
代替
Jack
Bob
Bob
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
我的情况非常复杂,这就是为什么我用简单数字替换原始数据的原因。因此,请不要注意非常简单的数据和条件是否“愚蠢”的情况。这只是一个例子。另外,如果有错,请忽略错别字-原始代码没有错字。
我有一些像这样的哈希值数组 my_hsh = {"numbers" => [1, 2, 3, 4], "n_count" => 4}
我需要做什么:
my_arr_nochange,the_hash["numbers"],my_arr_updt。所以代码:
the_hash = {"numbers" => []}
my_arr_updt = []
my_arr_nochange = []
array_of_hashes.each do |my_hsh|
if my_hsh["n_count"] == 4
my_arr_nochange << my_hsh
updated_hsh = my_hsh
my_hsh["numbers"].each do |num|
if num == 2
the_hash["numbers"] += [ num ]
updated_hsh["numbers"] -= [ num ]
end
end
my_arr_updt << updated_hsh
end
end
return the_hash, my_arr_updt, my_arr_nochange
Run Code Online (Sandbox Code Playgroud)
问题正在my_arr_nochange被修改,所以我没有获取旧状态的my_hsh而是获取了新状态。喜欢: …