【问题标题】:ruby: building string with length constraint composed from many variable length stringsruby:构建由许多可变长度字符串组成的具有长度约束的字符串
【发布时间】: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 不是一个好选择。只是感觉目的不对

标签: ruby string


【解决方案1】:

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

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

【讨论】:

  • 我认为您不小心将join 留在了那里。 (我故意让问题变得冗长和“程序化”,希望它能让问题更容易理解。)你的问题是一个有趣的解决方案。尤其是在考虑 text_a 之前处理“太长”的情况!谢谢你的想法。
  • @auxboss:是的,这是一个错误,我在更改代码时忘记删除它。一般来说,如果您发布一个特定的问题,您应该期望得到一个特定的答案。
  • 谢谢。我设法将它减少到两行(主要使用 .concat() ),这比我拥有的 3 行要好,而且更清晰,我认为更具可读性。
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 2016-12-21
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多