2010-02-04 35 views
1

我正在寫一個IRCd。對於這個話題,如果你對IRC有很多瞭解,這並不重要。它是一個簡單的代碼風格問題。好的方式來打破回覆成碎片在紅寶石

問題的快速概覽:

  • 沒有消息可以是超過512個字符
  • 如果該消息是多,它必須被破碎成碎片
  • 名稱回覆再發出的所有的暱稱頻道上的用戶,並且快速增長超過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。代碼已被略微修改,以便更容易理解的上下文

回答

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 

(在這裏我只是工作的字符串數組上。)

+0

我自己稍微修改了流程,但確切地說我在找什麼。 – user163365

0

要將字符串拆分爲512個字符串,您可以使用一些枚舉器魔法。這需要Ruby 1.8.7或更高版本:

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

我想要求一個不砍了一半某人的用戶名。 –