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

Pri*_*ock 44 ruby

  1. 它是安全的使用else ifelsif
  2. 它是否更好使用,elsif因为它遵循Ruby的打字约定?
  3. 或者这是一个偏好?

这是从书中获取的一段代码.我添加了额外的end关键字和交换elsif关键字与else ifs.

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
Run Code Online (Sandbox Code Playgroud)

这让我意识到这是多么丑陋else if.

Yu *_*Hao 63

你可以使用else if它,它是安全的.但请注意,这意味着需要额外的end关键字.

if n == 1
  puts "foo"
elsif n == 2
  puts "bar"
end
Run Code Online (Sandbox Code Playgroud)

在逻辑上是相同的:

if n == 1
  puts "foo"
else if n == 2
       puts "bar"
     end
end
Run Code Online (Sandbox Code Playgroud)

或等效的:

if n == 1
  puts "foo"
else 
  if n == 2
    puts "bar"
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 好吧,通常,`else`是独立的,而'else`块在下一行上缩进两个空格.如果你遵循那个正常的约定(为什么你不应该,毕竟'如果`不是特别的,因为*没有'else if**),那么它*真的*像拇指一样伸出来. (4认同)

one*_*ree 16

TL; DR -更换elsifelse 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
Run Code Online (Sandbox Code Playgroud)

第一个块将搜索另一个块end以关闭主条件.请注意,您可以使用单行if语句绕过额外的结尾.(如果执行的代码可以写在一行上,我只建议这样做.)

重要的是要注意,一旦你声明了一个else,你可能没有其他条件在同一层else.鉴于上面的第二个例子,第二个例子if嵌套在else.如果您要打电话elseelsif与初始电话处于同一层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
Run Code Online (Sandbox Code Playgroud)

请注意,这两个elsif语句都不能else if以干净的方式"转换"为.

更新:感谢Stefan,你仍然可以使用else if,导致一个非常嵌套的方法.

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

  • 将你的最后一个例子转换为`else if`将导致https://gist.github.com/sos4nt/a41b36d21f6eec5e0a42-这仍然是干净的,只是更嵌套. (2认同)