else if
使用elsif
是否安全?elsif
是否更好,因为它遵循Ruby的输入
约定?这是从一本书中取出的一段代码。我添加了额外的end
个关键字,并将elsif
个关键字与else if
s交换。
def describe(inhabitant)
if inhabitant == "sophie"
puts 'gender: female'
puts 'height: 145'
else if inhabitant == "paul"
puts 'gender: male'
puts 'height: 145'
else if inhabitant == "dawn"
puts 'gender: female'
puts 'height: 170'
else if inhabitant == "brian"
puts 'gender: male'
puts 'height: 180'
else if
puts 'species: Trachemys scripta elegans'
puts 'height: 6'
end
end
end
end
end
end
这让我意识到else if
是多么丑陋。
答案 0 :(得分:57)
您可以使用else if
并确保其安全。但请注意,这意味着需要额外的end
个关键字。
if n == 1
puts "foo"
elsif n == 2
puts "bar"
end
在逻辑上与:
相同if n == 1
puts "foo"
else if n == 2
puts "bar"
end
end
或同等的:
if n == 1
puts "foo"
else
if n == 2
puts "bar"
end
end
答案 1 :(得分:16)
TL; DR - 使用elsif
替换else if
对于只有2条路径的条件而言是正常的。请务必关闭使用if
创建的第二个else if
条件。最好的做法是尽可能少地使用条件级别,从而制定一种不太复杂的方法。谨慎一点,谨慎使用elsif
。
根据您计划编写方法的方式,else if
可能有效。然而,这并不是一个好习惯。
采用以下示例。只有两个条件。第二个条件看起来类似于elsif
,但被解释为第二个代码块:
# What you may want to write
if true
puts 'true'
else if false
puts 'false'
end
# How Ruby requires it
if true
puts 'true'
else
if false # You may also do: puts 'false' if false
puts 'false'
end
end
第一个块将搜索另一个end
以关闭主条件。请注意,您可以使用单行if
语句绕过额外的结尾。 (如果执行的代码可以写在一行上,我只建议这样做。)
请务必注意,一旦声明else
,您可能在与else
相同的层中没有其他条件。鉴于上面的第二个示例,第二个if
嵌套在else
下。如果您要在与初始else
相同的层上致电elsif
或else
,则条件将失败。
以下是您不希望实施else if
:
def describe(inhabitant)
if inhabitant == "sophie"
puts 'gender: female'
puts 'height: 145'
elsif inhabitant == "paul"
puts 'gender: male'
puts 'height: 145'
elsif inhabitant == "dawn"
puts 'gender: female'
puts 'height: 170'
elsif inhabitant == "brian"
puts 'gender: male'
puts 'height: 180'
else
puts 'species: Trachemys scripta elegans'
puts 'height: 6'
end
end
请注意,elsif
语句都不能以干净的方式“转换”为else if
。
更新:感谢Stefan,您仍然可以使用else if
,从而导致非常嵌套的方法。
答案 2 :(得分:3)
我希望elsif
超过else if
。但这只是我的观点,技术上没有区别。
但我建议您使用case
块而不是多个elsif
示例:
def describe(inhabitant)
case inhabitant
when "sophie"
puts 'gender: female'
puts 'height: 145'
when "paul"
puts 'gender: male'
puts 'height: 145'
when "dawn"
puts 'gender: female'
puts 'height: 170'
when "brian"
puts 'gender: male'
puts 'height: 180'
else
puts 'species: Trachemys scripta elegans'
puts 'height: 6'
end
或者我会将该映射存储在哈希中:
PEOPLE = {
'sophie' => { :gender => :female, :height => 145 },
'paul' => { :gender => :male, :height => 145 },
# ...
}
def describe(inhabitant)
description = PEOPLE.fetch(
inhabitant, { :species => 'Trachemys scripta elegans', :height => 6 }
)
puts "gender: #{description[:gender]}" if description[:gender]
puts "species: #{description[:species]}" if description[:species]
puts "height: #{description[:height]}"
end
答案 3 :(得分:0)
您应该选择能够提高代码可读性的选项。我在下面给出一个代码示例,我倾向于认为使用else if
更具可读性。
result = "Unknown"
error_code = 911
# Version 1 - uses else if
if result == "Success"
puts "Good job!"
else
if error_code == "100"
puts "No worries, we can still recover"
else
puts "Hopeless case!"
end
end
# Version 2 - uses elsif
if result == "Success"
puts "Good job!"
elsif result != "Success" and error_code == "100"
puts "No worries, we can still recover"
else
puts "Hopeless case!"
end
我猜这是必须对Level of Abstraction做些什么。如果if-elsif-else-end
中的所有条件都处于同一级别,那么它将更具可读性。如果它们处于不同的级别,则在代码中使用少量else if
可能会有所帮助。