如果表达式为空,你能解释一下在“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]
答案 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中,任何非false
或nil
的条件都在条件中评估为true
,因此最后elsif
始终评估为true(3
不是假的,也不是假的,并且有效地表现得像普通的else
。如果未指定任何内容,则返回的默认值为nil
,因此您会在结果中看到nil
。
答案 2 :(得分:0)
假设你的意思是你想要知道你正在迭代的元素是否为空白而不是因为没有匹配先前的评估而导致:
elsif i.blank?
如果你想要一个全能,那么只需使用:
else