为什么我可以执行= * ary.flatten而不仅仅是* ary.flatten?

时间:2015-09-02 21:24:16

标签: ruby

ary = = [[4, 8], [15, 16], [23, 42]]

在irb中,为什么我可以执行

a = *ary.flatten  # => [4,8,15,16,23,42]

但不仅仅是

*ary.flatten

给了我一个错误:

SyntaxError: (irb):97: syntax error, unexpected '\n', expecting '='
    from /usr/bin/irb:12:in `<main>'

我也可以执行

a,b,c,d,e,f = *ary.flatten

没有问题,按Enter键后返回的值是

=> [4, 8, 15, 16, 23, 42]

a,b,c,d,e,f现在属于Fixnum类。

那么,

是什么
*ary.flatten

毕竟回归?好像它应该返回ary的各个元素(它返回的对象到底是什么?),我可以分配给某些东西:a(以某种方式自动变成数组)或单独的变量a,b,c,d, e,f现在每个都是Fixnum。

此外,

a = *ary.flatten.class  # => [Array]
b = ary.flatten.class   # => Array

[Array]和Array有什么区别? (也许我应该把它作为一个单独的问题,但我只能每隔90分钟发布一次,我现在想知道!)

1 个答案:

答案 0 :(得分:3)

splat将数组转换为对象列表,就像使用逗号明确写出它们一样。所以,显然,它只能用于可以使用这种对象列表的地方。

a = 4, 8, 15, 16, 23, 42

是合法的,是并行作业。

4, 8, 15, 16, 23, 42

不合法,只是SyntaxError

  

那么,

是什么
*ary.flatten
     

毕竟回归?看起来它应该返回ary的各个元素(它返回的对象究竟是什么?),

它不会返回一个对象。它是一个语法结构,允许你获取一个数组并使用它,就好像你已经逐个手写出元素一样。

a = *ary.flatten.class  # => [Array]
b = ary.flatten.class   # => Array
     

[Array]和Array之间有什么区别?

Array是一个类,[Array]是一个包含单个元素的数组,它是类Array