Ruby中嵌套if语句赋值变量为何为nil?添加输出后返回domain?
Ruby变量赋值问题分析
为什么第一段代码中a是nil?
Ruby里,任何代码块(包括if块)的返回值,都是块内最后一个被执行的表达式的结果。我们拆解第一段代码:
a = if true "domain" if true # 条件为true,返回"domain",但这个值只是临时结果,没被保留 "nilr" if nil # nil是假值,条件不成立,这个表达式返回nil end
外层if true会执行内部两行代码,整个if块的返回值是最后一行表达式的结果——nil,所以a被赋值为nil。
为什么添加puts a.class后你看到a是"domain"?
这不是代码逻辑的问题,大概率是你在irb(交互式Ruby环境)中逐行输入代码时的操作误差:
比如你可能把赋值代码拆成了分步输入:
- 先输入
a = if true并回车,irb等待你输入块内代码 - 输入
"domain" if true并回车,irb会默认你结束了if块,直接把这行的结果"domain"赋值给a - 再输入
"nilr" if nil,这行的结果是nil但不会修改已经赋值的a - 最后执行
puts a.class,自然输出String,看起来a是"domain"
但如果把两段代码都保存成.rb脚本文件执行,不管有没有puts a.class,a的值都会是nil——因为脚本会按完整的if块执行,内部两行代码都会跑完,最后一行的nil作为块的返回值赋值给a。
内容的提问来源于stack exchange,提问作者isethi
相关产品推荐
相关产品推荐

