如何在使用Ruby拆分成数组时保留单个数据的数据类型?

时间:2012-08-01 09:06:06

标签: ruby ruby-on-rails-3

对于我的代码,我收到了客户端的数据流,这些数据以逗号分隔,每个字段的数据类型不同。收到后,我将它们拆分并写入数组。代码如下:

 require 'socket'

s = TCPSocket.open('localhost',2000)
time = Time.now.to_i
s.puts(cf,PUB,#{time},001.41011,N,103.76822)
s.close

在eventmachine服务器上,我编码如下:

require 'rubygems'
require 'eventmachine'
require './Load2MySQL.rb'

 module EchoServer

   def post_init
     puts "-- someone connected to the echo server!"
   end

   def receive_data data
       loc = Array.new(6)
       loc = data.split(',').to_a     

     wr2db(loc[0], loc[1], loc[2], loc[3], loc[4], loc[5])

   end

   def unbind
     puts "-- someone disconnected from the echo server!"
     close_connection
#     EventMachine::stop_event_loop
   end
 end

 EventMachine::run {
   EventMachine::start_server "0.0.0.0", 2000, EchoServer
 }

我发现这样做,数组中的所有元素都将转换为字符串。如何保留其数据类型?

此致 New2RoR

2 个答案:

答案 0 :(得分:0)

原因是使用split方法,它确实返回一个字符串数组。唯一的方法是沿着值发送每个元素的类型,或者,如果你已经知道它,在分割后强制类型如下:

float_val = loc(5).to_f

第三种方法是使用Ruby's CSV生成和解析字符串。它允许您使用读取值的字段转换器,并将其转换为浮点数或整数(如果适用)。

另外,我认为你不需要在Ruby中做loc = Array.new(6)。 此外,如果你正在使用一个已建立的mysql适配器,你真的不必担心存储之前的类型转换,如果这是你的问题,它将为你完成。

答案 1 :(得分:0)

您需要在通过TCP套接字发送之前编组对象。使用Marshal.dump(data)发送数据时,使用Marshal.load(data)接收数据时。有关详细信息,请查看ruby docs。另外,根据您的应用程序,您可能有兴趣使用Ruby DRB