Ruby to_ary方法混淆

时间:2012-05-05 23:01:47

标签: ruby methods

我查了一下Array类的to_ary方法。我很困惑该方法与其源文档的关系。

to_ary method =>返回自我

如果我这样做:

1.9.3-p0 :013 > a = [1,33,42]
=> [1, 33, 42] 
1.9.3-p0 :014 > a.to_ary
=> [1, 33, 42] 
1.9.3-p0 :015 > a
=>[1, 33, 42] 

为什么必须使用静态VALUE属性? VALUE是猎犬吗?参数之间的空格(而不是逗号)是否意味着第二个参数是接收方调用的方法?

static VALUE

rb_ary_to_ary_m(VALUE ary) 
{
   return ary;
}

最好,

cj3kim

2 个答案:

答案 0 :(得分:2)

这是C代码。 Ruby解释器是用C语言编写的。在此代码中,第一个参数用作self。红宝石中的等价物是:

def to_ary
  return self
end

答案 1 :(得分:1)

这里发生的是,它将它视为一个数组,IRB正在使用print方法将其推送到屏幕上。打印会将to_ary转换为字符串,因此您不会发现任何差异,当您使用puts时,您会看到不同之处。 Puts在后台使用to_ary,而print则使用to_s

to_ary方法用于隐式转换,而to_a用于显式转换。一个很好的例子是方法flatten,它采用多维数组并将其展平为单个维数组。除非使用危险方法,否则当您继续使用展平方法的连接时,实际变量将保持不变。这是因为flatten使用to_ary而非to_a,而flatten!使用to_ato_ary将其视为该实例的数组,但不会永久更改该变量。