Хороший способ разбить ответ на кусочки в рубине - PullRequest
1 голос
/ 04 февраля 2010

Я пишу 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 ]

1 голос
/ 04 февраля 2010

Я не могу придумать, как упростить логику, но метод 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 голосов
/ 04 февраля 2010

Чтобы разделить строку на 512 строк символов, вы можете использовать магию Enumerator. Для этого требуется Ruby 1.8.7 или выше:

long_string.each_char.each_slice(512).map{ |chunk| chunk.join }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...