空格 (Whitespace)
缩进 (Indentation)
始终用 2 个空格做缩进。[link]
when
的缩进和case
一致。
[link]case
when song.name == 'Misty'
puts 'Not again!'
when song.duration > 120
puts 'Too long!'
when Time.now.hour > 21
puts "It's too late"
else
song.play
end
kind = case year
when 1850..1889 then 'Blues'
when 1890..1909 then 'Ragtime'
when 1910..1929 then 'New Orleans Jazz'
when 1930..1939 then 'Swing'
when 1940..1950 then 'Bebop'
else 'Jazz'
end
函数的参数要么全部在同一行,如果参数要分成多行,则每行一个参数, 相同缩进。[link]
# 错误
def self.create_translation(phrase_id, phrase_key, target_locale,
value, user_id, do_xss_check, allow_verification)
...
end
# 正确
def self.create_translation(phrase_id,
phrase_key,
target_locale,
value,
user_id,
do_xss_check,
allow_verification)
...
end
# 正确
def self.create_translation(
phrase_id,
phrase_key,
target_locale,
value,
user_id,
do_xss_check,
allow_verification
)
...
end
多行的布尔表达式,下一行缩进一下。[link]
# 错误
def is_eligible?(user)
Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) &&
is_in_program?(user) &&
program_not_expired
end
# 正确
def is_eligible?(user)
Trebuchet.current.launch?(ProgramEligibilityHelper::PROGRAM_TREBUCHET_FLAG) &&
is_in_program?(user) &&
program_not_expired
end
行内 (Inline)
行末不要留空格。
[link]写行内注释的时候,在代码和注释之间放 1 个空格。
[link]# 错误
result = func(a, b)# we might want to change b to c
# 正确
result = func(a, b) # we might want to change b to c
操作符两边放一个空格;逗号,冒号,分号后面都放一个空格;左大括号
{
两边放空格,右大括号}
左边放空格。
[link]sum = 1 + 2
a, b = 1, 2
1 > 2 ? true : false; puts 'Hi'
[1, 2, 3].each { |e| puts e }
逗号前面永远不要放空格
[link]result = func(a, b)
block 语法里,| | 内部的两边不应该带多余的空格,参数之间应该有1个空格,| | 后面应该有一个空格
[link]# 错误
{}.each { | x, y |puts x }
# 正确
{}.each { |x, y| puts x }
感叹号和参数间不要留空格,下面是个正确的例子。[link]
!something
(
,[
后面不要有空格
]
,)
前面不要有空格
[link]some(arg).other
[1, 2, 3].length
字符串插值时候忽略空格。[link]# 错误
var = "This # { foobar } is interpolated."
# 正确
var = "This # {foobar} is interpolated."
当表达范围时,不要写额外的空格。[link]
# 错误
(0 ... coll).each do |item|
# 正确
(0...coll).each do |item|
换行 (Newlines)
if 条件保持相同缩进,方便识别哪些是条件,哪些是内容。
[link]if @reservation_alteration.checkin == @reservation.start_date &&
@reservation_alteration.checkout == (@reservation.start_date + @reservation.nights)
redirect_to_alteration @reservation_alteration
end
条件语句,块,case 语句,等等东西后面换一行, 例子如下。[link]
if robot.is_awesome?
send_robot_present
end
robot.add_trait(:human_like_intelligence)
不同缩进的代码之间无需空行 (比如 class 或 module 和内容之间)。
[link]# 错误
class Foo
def bar
# body omitted
end
end
# 正确
class Foo
def bar
# body omitted
end
end
方法之间 1 个空行就好。[link]
def a
end
def b
end
1 个空行隔开类似的逻辑。
[link]def transformorize_car
car = manufacture(options)
t = transformer(robot, disguise)
car.after_market_mod!
t.transform(car)
car.assign_cool_name!
fleet.add(car)
car
end
文件末尾只放一个空行。
[link]