奇怪的Ruby数组表示法'| WN |'?

时间:2013-12-12 20:37:37

标签: ruby-on-rails ruby arrays r rserve

我正在使用rserve-client gem,它允许Ruby脚本通过TCP / IP与R通信。部分原因是将Ruby对象序列化以通过线路发送,并透明地转换回Ruby的结果。

然而,返回的数组对象有一个奇怪的符号,我以前从未见过,当R表被翻译回Ruby时。

例如,具有命名id列和3个值的R表返回:

res
=> [|WN|"id"=[1,
   2,
   3]
res.to_s
=> "[id=[1, 2, 3]]"
res.class
=> Array
res.inspect
=> "#<Array:70227288405140 [id=[1, 2, 3]]>"
res.class.ancestors == Array.ancestors
=> true
=> [[1,
  2,
  3]]

知道这是什么吗?理想情况下,我想将其转换为哈希以使用ID ... to_hash无法得到它。 .to_a导致:

2 个答案:

答案 0 :(得分:1)

这不是有效的数组表示法。我没有任何关于这个宝石的具体知识,但我猜想作者采取了令人沮丧的道路给你撒谎。这是一个显示类似行为的简单类。

class A < Array
  def class
    Array
  end

  def inspect
    "[|WN| blah=[1,2,3]]"
  end
end

输出

foo = A.new #=> [|WN| blah=[1,2,3]]
foo.class #=> Array
foo.class.ancestors == Array.ancestors #=> true

这种做法并不像应该的那样不寻常。 ActiveRecord::Relation至少用来做类似的事情。

答案 1 :(得分:1)

答案在rserve宝石来源中。 Array已使用新的pretty_print方法进行了修饰:

def pretty_print(q)
  q.group(1,'[|WN|',']') {
  ...
end

https://github.com/clbustos/Rserve-Ruby-client/blob/a4edabd5c742f08a9b2394ce255707219aafd7df/lib/rserve/withnames.rb#L16