在红宝石中打破回复的好方法

时间:2010-02-04 10:36:32

标签: ruby string coding-style

我正在写一个IRCd。对于这个主题,如果你对IRC了解很多,那就无所谓了。这是一个简单的代码风格问题。

问题的快速概述:

  • 没有消息可能超过512个字符
  • 如果消息更多,则必须将其分成几部分
  • NAMES回复会在频道上发送用户的所有昵称,并快速增长超过512个字符。

我目前编造了这段奇妙的代码,它完美无缺。然而,它只是不像“红宝石般”。这段代码更符合您对某些C代码的期望。

# 11 is the number of all fixed characters combined in the reply
pre_length = 11 + servername.length + mynick.length + channel.name.length
list = [""]
i = 0
channel.nicks.each do |nick, client|
  list[i+=1] = "" if list[i].length + nick.length + pre_length > 500
  list[i] << "#{channel.mode_char(client)}#{client.nick} "
end
list.each { |l| send_numeric(RPL_NAMREPLY, channel.name, l.strip) }
send_numeric(RPL_ENDOFNAMES, channel.name)

所以我的问题是,有什么想法可以做得更好吗?

PS。代码稍作修改,以便更容易理解上下文

2 个答案:

答案 0 :(得分:1)

我想不出一种简化逻辑的方法,但Enumerable#inject方法捕获了“在遍历列表时构建结果”的模式:

stuff = %w(my list of words)
list = stuff.inject([""]) do |result,obj|
  tsst = result[-1] + " " + obj
  if tsst.length > 500 then result << obj else result[-1] = tsst end
  result
end

(这里我只是处理一个字符串数组。)

答案 1 :(得分:0)

要将字符串拆分为512个字符串,您可以使用一些Enumerator魔法。这需要Ruby 1.8.7或更高版本:

long_string.each_char.each_slice(512).map{ |chunk| chunk.join }