我可以在`elsif`上使用`else if`吗?

时间:2015-08-06 15:08:44

标签: ruby

  1. else if使用elsif是否安全?
  2. 使用elsif是否更好,因为它遵循Ruby的输入 约定?
  3. 或者这是偏好吗?
  4. 这是从一本书中取出的一段代码。我添加了额外的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是多么丑陋。

4 个答案:

答案 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相同的层上致电elsifelse,则条件将失败。

以下是您不希望实施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,从而导致非常嵌套的方法。

https://gist.github.com/sos4nt/a41b36d21f6eec5e0a42

答案 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可能会有所帮助。