3

如果表达式为空,您能解释一下在“elsif”中使用 ruby​​ 的表达式是什么吗?

arg = 3
if (arg == 1)
  puts "1"
elsif (arg == 2)
  puts "2"
elsif
  puts "3"
end

p (1...10).map { |i|
  if (i == 1)
    1
  elsif (i == 2)
    2
  elsif
    3
  end
}

脚本输出:

3
[1, 2, nil, nil, nil, nil, nil, nil, nil]
4

3 回答 3

4

基本上还有很多话要说:

在分支中,只要找到任何匹配条件,块if-else就返回匹配子句的最后一条语句。if-else考虑以下:

arg = 4
p m = if (arg == 1)
   "1"
elsif (arg == 3)
   "3"
elsif (arg ==4)
   "5";"11"
elsif
   "3"
end

输出:

#11

但是在与每个子句匹配期间,如果找到任何裸子elsif,则if-else块检查其直接表达式的真值并相应地返回值:

arg = "4"
p m = if (arg == "1")
   47
elsif 
   10 ; "7" 
elsif (arg =="5")
   12;14
elsif
   2
end

输出:

#"7"

下面的代码将nil作为无返回10值作为条件检查返回,之后代码中没有任何内容。所以nil被退回了。

arg = "4"
p m = if (arg == "1")
   47
elsif 
   10 
elsif (arg =="5")
   12;14
elsif
   2
end  #nil

下面的另一个代码使事情最终变得清晰:

arg = "4"
p m = if (arg == "1")
   47
elsif 
   nil 
elsif (arg =="5")
   12;14
elsif
   2 ; "44"
end  #44

综上所述,我希望上面的原因很清楚 - 下面的代码输出:[1, 2, nil, nil, nil, nil, nil, nil, nil]

p (1...10).map { |i|
  if (i == 1)
    1
  elsif (i == 2)
    2
  elsif
    3
  end
}

要回答您的第一个代码,请先查看以下两个代码:

m = if puts "hi"
p "hello"
end #"hi"

“hi”作为puts返回值打印nil在哪个if子句上,false因此hello不会打印。但是下面的代码按照p那里使用的方式执行,并且if子句在p返回值上执行,即true.

m = if p "hi"
p "hello"
end 

#"hi"
#"hello"

现在希望您理解为什么3从下面的代码输出,从以上所有逻辑作为一个整体应用:

arg = 3
if (arg == 1)
  puts "1"
elsif (arg == 2)
  puts "2"
elsif
  puts "3"
end
于 2013-04-04T15:29:02.497 回答
3

如果同一行没有表达式,则将下一行的表达式用作条件。你不能有一个空的表达式。

您的第一个示例等效于:

arg = 3
if (arg == 1)
  puts "1"
elsif (arg == 2)
  puts "2"
elsif puts "3" # puts is the condition
  #empty
end

第一个或第二个条件都不是真的,因为puts返回nil也不是最后一个。但是puts在返回之前打印它的参数nil,所以你仍然可以3在输出中看到。

同样,您的第二个示例等效于:

p (1...10).map { |i|
  if (i == 1)
    1
  elsif (i == 2)
    2
  elsif 3
    nil #nil is the default if no result is specified
  end
}

由于在 Ruby 中任何不是falsenil评估为true条件的东西,最后一个elsif总是评估为 true (3不是 false 或 nil),并且有效地表现得像一个 plain elsenil如果未指定任何内容,则返回的默认值也是如此,因此您会nil在结果中看到 s 。

于 2013-04-04T16:37:59.843 回答
0

假设您的意思是您想知道您正在迭代的元素是否为空白,而不是因为与以前的评估不匹配而失败:

elsif i.blank?

如果你想要一个包罗万象的,那么只需使用:

else
于 2013-04-04T16:21:45.470 回答