1

我正在使用 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 结果:

4

2 回答 2

1

答案在 rserve gem 源代码中。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

于 2013-12-12T20:59:37.723 回答
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至少曾经做过类似的事情。

于 2013-12-12T20:55:33.090 回答