Ruby on rails “

Ruby on rails “,ruby-on-rails,ruby,Ruby On Rails,Ruby,对不起,标题太乱了 如果我使用rails控制台的静态值: 2.1.2 :013 > h=[] => [] 2.1.2 :014 > h<<[1] => [[1]] 2.1.2 :015 > h<<[1,2] => [[1], [1, 2]] 2.1.2 :016 > h<<[1,2,3] => [[1], [1, 2], [1, 2, 3]] 这还行,但引号也会引起其他问题。理想

对不起,标题太乱了

如果我使用rails控制台的静态值:

 2.1.2 :013 > h=[]
  => [] 
 2.1.2 :014 > h<<[1]
  => [[1]] 
 2.1.2 :015 > h<<[1,2]
  => [[1], [1, 2]] 
 2.1.2 :016 > h<<[1,2,3]
  => [[1], [1, 2], [1, 2, 3]] 
这还行,但引号也会引起其他问题。理想情况下,我希望他们像这样:

 2.1.2 :018 > h=[]
  => [] 
 2.1.2 :019 > a=1
  => 1 
 2.1.2 :020 > h<<a
  => [1] 
 2.1.2 :021 > a=[1,2]
  => [1, 2] 
 2.1.2 :022 > h<<a   
  => [1, [1, 2]] 
 2.1.2 :023 > a=[1,2,3]
  => [1, 2, 3] 
 2.1.2 :024 > h<<a
  => [1, [1, 2], [1, 2, 3]] 
 ["[1]", "[1,2]", "[1,2,3]"]
 [[1], [1,2], [1,2,3]]

有没有办法防止这种情况发生?或者,使用另一种方式将数组插入哈希/array/json变量?

您可以在插入数组之前复制引用:

> h = []
> a = []
> a << 1
> h << a.dup
> a << 2
> h << a.dup
> a << 3
> h << a.dup
> h
# => [[1], [1, 2], [1, 2, 3]]

在插入阵列之前,可以复制引用:

> h = []
> a = []
> a << 1
> h << a.dup
> a << 2
> h << a.dup
> a << 3
> h << a.dup
> h
# => [[1], [1, 2], [1, 2, 3]]

您需要了解Ruby通过引用“”有效地传递参数–只有基本类型(如float、int、true、false和nil)是不可变的,因此不会暴露您观察到的行为。对于所有其他对象,一种可能的解决方法是使用dup:


尽管Ruby在内部是按值传递的,但这些值是引用

您需要了解Ruby有效地按引用传递参数\–只有基本类型(如float、int、true、false和nil)是不可变的,因此不会暴露您观察到的行为。对于所有其他对象,一种可能的解决方法是使用dup:


尽管Ruby在内部通过值传递它们,但这些值是引用

您可以通过Objectobject\u id获取变量“a”的对象id,这可以帮助您理解

irb(main):060:0> a= 1
=> 1
irb(main):061:0> a.object_id
=> 3
irb(main):062:0> a= [1,2]
=> [1, 2]
irb(main):063:0> a.object_id
=> 20017440
irb(main):064:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):065:0> a.object_id
=> 19627820
变量a的对象id不同

irb(main):066:0> a= []
=> []
irb(main):067:0> a << 1
=> [1]
irb(main):068:0> a.object_id
=> 18718920
irb(main):069:0> a << 2
=> [1, 2]
irb(main):070:0> a.object_id
=> 18718920
irb(main):071:0> a << 3
=> [1, 2, 3]
irb(main):072:0> a.object_id
=> 18718920

如果使用可以通过Objectobject_id获取变量“a”的对象id,这有助于理解

irb(main):060:0> a= 1
=> 1
irb(main):061:0> a.object_id
=> 3
irb(main):062:0> a= [1,2]
=> [1, 2]
irb(main):063:0> a.object_id
=> 20017440
irb(main):064:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):065:0> a.object_id
=> 19627820
变量a的对象id不同

irb(main):066:0> a= []
=> []
irb(main):067:0> a << 1
=> [1]
irb(main):068:0> a.object_id
=> 18718920
irb(main):069:0> a << 2
=> [1, 2]
irb(main):070:0> a.object_id
=> 18718920
irb(main):071:0> a << 3
=> [1, 2, 3]
irb(main):072:0> a.object_id
=> 18718920

如果你用它来帮助理解发生了什么,谢谢。我很困惑,因为我总是假设它是值,而不是引用。Ruby是按值传递的,尽管传递的值总是引用。您所指的简单类型实际上是不可变的值,即不能更改的对象。其中包括Fixnum、Float、true、false和nil。但是字符串不是不可变的,因为str=Hello;最后,不能在h上使用+=来获得所需的结果。粘贴的代码不起作用,产生的结果与注释中建议的结果不同。@HolgerJust非常有用的补充,谢谢。编辑我的答案以反映这些方面。从现在删除的答案中复制的代码确实不正确,对此表示抱歉。这有助于理解发生了什么,谢谢。我很困惑,因为我总是假设它是值,而不是引用。Ruby是按值传递的,尽管传递的值总是引用。您所指的简单类型实际上是不可变的值,即不能更改的对象。其中包括Fixnum、Float、true、false和nil。但是字符串不是不可变的,因为str=Hello;最后,不能在h上使用+=来获得所需的结果。粘贴的代码不起作用,产生的结果与注释中建议的结果不同。@HolgerJust非常有用的补充,谢谢。编辑我的答案以反映这些方面。从现在已删除的答案复制的代码确实不正确,对此表示抱歉。就是这样。非常感谢。成功了。非常感谢。
irb(main):066:0> a= []
=> []
irb(main):067:0> a << 1
=> [1]
irb(main):068:0> a.object_id
=> 18718920
irb(main):069:0> a << 2
=> [1, 2]
irb(main):070:0> a.object_id
=> 18718920
irb(main):071:0> a << 3
=> [1, 2, 3]
irb(main):072:0> a.object_id
=> 18718920