【问题标题】:Strange Ruby array notation '|WN|'?奇怪的 Ruby 数组表示法“|WN|”?
【发布时间】:2013-12-12 20:37:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案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

    【讨论】:

      【解决方案2】:

      这不是有效的数组表示法。我对这颗宝石没有任何具体知识,但我猜作者走的是欺骗你的令人沮丧的道路。这是一个显示类似行为的简单类。

      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 至少曾经做过类似的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 2020-06-14
        相关资源
        最近更新 更多