我想我會拋出這個問題,看看 能想出什麼優雅的解決方案民俗了,並且在這個過程中,希望學習一些新的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
這很醜,尤其是重複。想法?
而是從上面複製的代碼,爲什麼不''gsub'「固定前綴#{} text_a」'用截斷的版本? –
所以:'text.gsub(text_a,text_a [0 ..-(excess_length + 1)])' GSUB替換所有出現,所以,雖然不太可能的,它可以在text_b和/或後綴跺腳。 – auxbuss
使用'gsub'作業是一個非常糟糕的主意,特別是因爲我們可以做'text_a [0 ..-(excess_length + 1)] +文本[text_a.size ..- 1]' –