2012-05-01 45 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