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
Ruby 省略数组中散列的大括号_Ruby_Ruby 1.9.3 - Fatal编程技术网

Ruby 省略数组中散列的大括号

Ruby 省略数组中散列的大括号,ruby,ruby-1.9.3,Ruby,Ruby 1.9.3,我意识到,如果哈希是数组中的最后一个元素,则可以省略它的大括号。例如,表格: [1, 2, 3, :a => 'A', :b => 'B'] [1, 2, 3, a: 'A', b: 'B'] 似乎与: [1, 2, 3, {:a => 'A', :b => 'B'}] [1, 2, 3, {a: 'A', b: 'B'}] 我知道这种省略对于方法的参数是可能的,但没有注意到对于数组也是可能的。我对这条规则的理解正确吗?还有,这是在什么地方描述的吗?我认为括号(没有括

我意识到,如果哈希是数组中的最后一个元素,则可以省略它的大括号。例如,表格:

[1, 2, 3, :a => 'A', :b => 'B']
[1, 2, 3, a: 'A', b: 'B']
似乎与:

[1, 2, 3, {:a => 'A', :b => 'B'}]
[1, 2, 3, {a: 'A', b: 'B'}]
我知道这种省略对于方法的参数是可能的,但没有注意到对于数组也是可能的。我对这条规则的理解正确吗?还有,这是在什么地方描述的吗?

我认为括号(没有括号,如下所示)被称为散列文字,ruby只是试图将其作为数组元素

>> [1, 2, c: 'd', e: 'f'] # ruby 1.9 hash literals
=> [1, 2, {:c=>"d", :e=>"f"}]
但我认为没有更多的规则,你不能这样做:

>> [1, 2, c: 'd', e: 'f', 5] # syntax error, unexpected `]` (waiting for => or :)

这似乎是1.9的一个新特性:

$ rvm use 1.8.7
$ irb
ruby-1.8.7-p352 :001 > x = [ 1,2,3,:a => 4, :b => 5 ]
SyntaxError: compile error
(irb):1: syntax error, unexpected tASSOC, expecting ']'
x = [ 1,2,3,:a => 4, :b => 5 ]
                 ^
  from (irb):1
ruby-1.8.7-p352 :002 > exit
$ rvm use 1.9.3
$ irb
ruby-1.9.3-p0 :001 > x = [ 1,2,3,:a => 4, :b => 5 ]
 => [1, 2, 3, {:a=>4, :b=>5}] 
ruby-1.9.3-p0 :002 >

我假设在理论上,
[…]
是对一个类似于
def x(*args)
的方法的方法调用,因此该行为是有意义的。也许可以挖掘数组文字处理C代码,看看它是如何在内部处理的。不过,我不会将它用作编码实践。我更喜欢看到
{
}
提供的视觉定界,并在代码评审中声明。这是一个维护和可读性的问题。@THINMAN应该视情况而定。我有一个DSL,其中使用嵌套数组和散列来编写内容。在每个数组的末尾,要用数组的该部分指定的某些对象的属性可以由散列指定,而且这种情况非常频繁,如果这种省略是可能的,就会产生巨大的差异。你误解了我的意思<代码>[1,2,3,:a=>'b']在某种意义上是对数组构造函数方法的方法调用,因此它的行为当然与其他所有方法调用一样,并自动散列其参数。我可以告诉您,它在1.8.6或1.8.7中不起作用,但在1.9.1中起作用。返回的类型不是散列,而是数组,所以它是一个带有嵌入式哈希字面值的数组字面值是的,没错。你希望得到这样的散列文字:
a:b,c:d
?请注意,数组只包含散列的情况在1.8.x:
ruby 1.8.6-p420:001>x=[:a=>4,:b=>5]=>[{:a=>4,:b=>5}]