ruby:具有长度约束的构造字符串,由许多可变长度字符串组成

时间:2012-05-01 10:10:47

标签: ruby string

我认为我会抛弃这个问题,看看民间的优雅解决方案 可以提出,并在此过程中,希望学习一些新的红宝石 技巧。

我将在生成推特消息的上下文中设置问题, 最大长度为140个字符。我正在寻找一个简洁的方法 将发送不超过140个字符的推文的函数 三个输入:text_a(强制),text_b(可选),布尔值 触发一个返回字符串的函数(可选)。

(我使用了twitter-text gem来获取字节,字符和编码问题 因为这不是问题的焦点。)

主要的限制是要达到所需的最大长度,它 是必须截断的text_a。

希望这是一些冗长的示例代码(工作,我认为) 使要求明确。

# encoding: utf-8

require 'twitter-text'

def tweet(text_a, text_b=nil, suffix=false)
  text = "fixed preamble #{text_a}"
  text << " #{text_b}" if text_b
  text << get_suffix if suffix
  return text unless Twitter::Validation.tweet_invalid?(text) == :too_long
  excess_length = Twitter::Validation.tweet_length(text) - Twitter::Validation::MAX_LENGTH
  text_a = text_a[0..-(excess_length + 1)]
  text = "fixed preamble #{text_a}"
  text << " #{text_b}" if text_b
  text << get_suffix if suffix
  text
end

def get_suffix
  " some generated suffix"
end

这很难看,尤其是复制时。想法?

1 个答案:

答案 0 :(得分:0)

为什么不首先正确构建字符串?

def tweet(text_a, text_b=nil, suffix=false)
  text = ""
  text << " #{text_b}" if text_b
  text << get_suffix if suffix

  space = Twitter::Validation::MAX_LENGTH - Twitter::Validation.tweet_length(text)
  raise "too long" unless space > 0

  "fixed preamble #{text_a}"[0, space] + text
end