1

我想我会抛出这个问题,看看人们能想出什么优雅的解决方案,并且在这个过程中,希望能学到一些新的 ruby​​ 技巧。

我将在生成 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

这很丑陋,尤其是在重复的情况下。想法?

4

1 回答 1

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
于 2012-05-01T11:05:33.767 回答