在elsif部分的空状态

时间:2013-04-04 15:21:28

标签: ruby

如果表达式为空,你能解释一下在“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]

3 个答案:

答案 0 :(得分: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 来自以下代码的输出,从上面所有逻辑应用为整体:

{{1}}

答案 1 :(得分:2)

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

您的第一个示例与此相同:

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

第一个或第二个条件都不是真的,因为puts returns 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不是假的,也不是假的,并且有效地表现得像普通的else。如果未指定任何内容,则返回的默认值为nil,因此您会在结果中看到nil

答案 2 :(得分:0)

假设你的意思是你想要知道你正在迭代的元素是否为空白而不是因为没有匹配先前的评估而导致:

elsif i.blank?

如果你想要一个全能,那么只需使用:

else