2012-05-01 44 views
1

我想我会抛出这个问题,看看 能想出什么优雅的解决方案民俗了,并且在这个过程中,希望学习一些新的Ruby 技巧组成的长度约束。红宝石:构建字符串许多可变长度字符串

我将在制造Twitter信息, ,其具有140个字符的最大长度的范围内设置的问题。我在寻找一个简洁 功能,将不再提供一个鸣叫超过140个字符从 三个输入:text_a(强制性),text_b(可选),布尔值, 触发返回一个字符串(可选)功能。

(我使用Twitter的文本宝石取字节,char和编码问题 出去游玩,因为这是不是问题的重点。)

的主要制约因素是,要实现所需的最大长度,它是 是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 

这很丑,尤其是重复。想法?

+0

而是从上面复制的代码,为什么不''gsub'“固定前缀#{} text_a”'用截断的版本? –

+0

所以:'text.gsub(text_a,text_a [0 ..-(excess_length + 1)])' GSUB替换所有出现,所以,虽然不太可能的,它可以在text_b和/或后缀跺脚。 – auxbuss

+0

使用'gsub'作业是一个非常糟糕的主意,特别是因为我们可以做'text_a [0 ..-(excess_length + 1)] +文本[text_a.size ..- 1]' –

回答

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 
+0

我想你错误地把'join'留在那里了。 (我故意提出了详细的问题和“程序性”问题,希望能够使问题更容易理解。) 您的问题是一个有趣的解决方案。尤其是在处理text_a之前的“太长”情况时,甚至可以考虑!感谢您的想法。 – auxbuss

+0

@auxboss:是的,那是一个错误,我在更改代码时忘记删除它。一般来说,如果你发布了一个具体的问题,你应该期待得到一个具体的答案。 –

+0

谢谢你。我设法将它减少到两行(主要使用.concat()),这比我的3更好,它更清晰,我认为它更具可读性。 – auxbuss