Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 意外的数组行为_Ruby_Arrays_Variables - Fatal编程技术网

Ruby 意外的数组行为

Ruby 意外的数组行为,ruby,arrays,variables,Ruby,Arrays,Variables,下面的modify方法以某种方式修改了整个@x数组,而不是简单地生成另一个要稍后推送的元素。为什么 def modify i, s t = @x[-1] t[i] = t[i] + s t end @x = [ [10, 12] ] @x << modify(0, 1) puts @x @x[-1]是内部数组[10,12]。您将t设置为引用此数组。然后用t[i]=部分修改此数组。您可能应该从头开始重做,但本着小改动的精神。。。尝试改变你的方法以减少副作用 如果要返回

下面的modify方法以某种方式修改了整个@x数组,而不是简单地生成另一个要稍后推送的元素。为什么

def modify i, s
  t = @x[-1]
  t[i] = t[i] + s
  t
end

@x = [ [10, 12] ]
@x << modify(0, 1)

puts @x

@x[-1]
是内部数组[10,12]。您将
t
设置为引用此数组。然后用
t[i]=
部分修改此数组。

您可能应该从头开始重做,但本着小改动的精神。。。尝试改变你的方法以减少副作用

如果要返回单个Fixnum元素:

def modify i, s
  t = @x[-1]
  r = t[i] + s
  r
end
或者,如果希望返回一个数组以注入到更大的元组数组中

def modify i, s
  t = @x[-1].dup
  t[i] = t[i] + s
  t
end
本着理解的精神,您应该仔细阅读Ruby对象,了解它们是如何引用的,以及Ruby方法是如何产生副作用的

研究这一点:

a=[1,2]
b=a
b[0]=4
puts a
> [4,2]
你可能想做个傻事

a=[1,2]
b=a.dup
b[0]=4
puts a
> [1,2]

如何将t-variable设置为不引用,而只选取值?丢失t[I]=并用任何新的值替换它variable@avguchenko:正如我在对你的回答的评论中所说的那样,那不会产生预期的效果。他似乎想要数组的修改版本。将
t
的突变替换为包含单个
t
元素的变量不起作用。子变量太多。。。是否有机会传递值而不是链接?这不仅消除了副作用,还改变了方法的返回类型。以前,它返回一个数组。此版本返回一个整数。因为它看起来是一个数组,这可能是不正确的。我想我们都可以同意,gmile的例子有很多问题。@Chuck:问题指定他要生成“另一个待推的元素”。我认为这是问题含糊不清的副作用。我觉得否决票是不公平的。你能澄清一下你在这里想要实现什么吗。您希望该方法做什么?另外,为什么在方法中引用一个特定的实例变量(
@x
),而不是,比如说,
self
?很清楚为什么这个方法会修改整个@x。不清楚的是你想要实现什么。它的用途是什么?你能详细说明一下上下文吗?我正在尝试修改一个共享向量(@x[-1]),然后将修改后的版本推送到@x数组。问题包括两部分:1。我只需要修改向量2的一个分量。Vector可以容纳浮点组件(.clone不会这样做)
a=[1,2]
b=a.dup
b[0]=4
puts a
> [1,2]