【发布时间】:2012-05-10 21:28:39
【问题描述】:
我想我会抛出这个问题,看看人们有什么优雅的解决方案 可以想出,并且在这个过程中,希望能学到一些新的红宝石 技巧。
我将在生成 Twitter 消息的上下文中设置问题, 最大长度为 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
这很丑陋,尤其是重复。想法?
【问题讨论】:
-
与其从上面复制代码,为什么不直接将
gsub"fixed preamble #{text_a}"与截断版本一起使用? -
So:
text.gsub(text_a, text_a[0..-(excess_length + 1)])gsub 会替换所有出现的位置,因此尽管不太可能,但它可能会踩到 text_b 和/或后缀。 -
在工作中使用
gsub是一个非常糟糕的主意,尤其是因为我们可以只使用text_a[0..-(excess_length + 1)] + text[text_a.size..-1] -
这不是错过了“序言”吗?所以应该是
"fixed preamble " + text_a[0..-(excess_length + 1)] + text[text_a.size+15..-1],不太好。 -
@auxbuss:对,忘了那个。我仍然认为使用
gsub不是一个好选择。只是感觉目的不对