我正在写一个IRCd。对于这个主题,如果你对IRC了解很多,那就无所谓了。这是一个简单的代码风格问题。
问题的快速概述:
我目前编造了这段奇妙的代码,它完美无缺。然而,它只是不像“红宝石般”。这段代码更符合您对某些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。代码稍作修改,以便更容易理解上下文
答案 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 }