盡量使用字符串插值(interpolation),而不是字符串連接(concatenation)。
# 差
email_with_name = user.name + ' <' + user.email + '>'
# 好
email_with_name = "#{user.name} <#{user.email}>"
對于插值表達式, 括號內不應有留白(padded-spacing)。
# 差
"From: #{ user.first_name }, #{ user.last_name }"
# 好
"From: #{user.first_name}, #{user.last_name}"
選定一個字符串字面量創(chuàng)建的風格。Ruby 社區(qū)認可兩種分割,默認用單引號(風格 A)和默認用雙引號(風格 B)
(風格 A)當你不需要插入特殊符號如?\t
,?\n
,?'
, 等等時,盡量使用單引號的字符串。
# 差
name = "Bozhidar"
# 好
name = 'Bozhidar'
(風格 B)?用雙引號。除非字符串中含有雙引號,或者含有你希望抑制的逃逸字符。
# 差
name = 'Bozhidar'
# 好
name = "Bozhidar"
有爭議的是,第二種風格在 Ruby 社區(qū)里更受歡迎一些。但是本指南中字符串采用第一種風格。
不要用??x
。從 Ruby 1.9 開始,??x
?和?'x'
?是等價的(只包括一個字符的字符串)。
# 差
char = ?c
# 好
char = 'c'
別忘了使用?{}
?來圍繞被插入字符串的實例與全局變量。
class Person
attr_reader :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
# 差 - 有效,但難看
def to_s
"#@first_name #@last_name"
end
# 好
def to_s
"#{@first_name} #{@last_name}"
end
end
$global = 0
# 差
puts "$global = #$global"
# 好
puts "$global = #{$global}"
字符串插值不要用?Object#to_s
?。Ruby 默認會調用該方法。
# 差
message = "This is the #{result.to_s}."
# 好
message = "This is the #{result}."
當你需要建構龐大的數(shù)據(jù)塊(chunk)時,避免使用?String#+
?。 使用?String#<<
?來替代。<<
?就地改變字符串實例,因此比?String#+
?來得快。String#+
?創(chuàng)造了一堆新的字符串對象。
# 好也比較快
html = ''
html << '<h1>Page title</h1>'
paragraphs.each do |paragraph|
html << "<p>#{paragraph}</p>"
end
當你可以選擇更快速、更專門的替代方法時,不要使用?String#gsub
。
url = 'http://example.com'
str = 'lisp-case-rules'
# 差
url.gsub("http://", "https://")
str.gsub("-", "_")
# 好
url.sub("http://", "https://")
str.tr("-", "_")
heredocs 中的多行文字會保留前綴空白。因此做好如何縮進的規(guī)劃。
code = <<-END.gsub(/^\s+\|/, '')
|def test
| some_method
| other_method
|end
END
#=> "def\n some_method\n \nother_method\nend"
更多建議: