回答
defined?
方法将返回:
零 =>表达不可识别
在上述代码段的问题是局部变量的范围。 Its end on the line where you using it
。要了解更多关于本地变量,请检查:local_variable
pry(main)> p "local_var is not initialized" unless defined? local_var
=> "loca_var is not initialized"
,但如果你这样做:
pry(main)> local_var = "initialized" unless defined? local_var
=> nil
local_var仍然nil
,因为这行之后其范围的结束,所以无论怎样分配都白费了。
解决方案:如果您希望此行为,然后用这一个,我会建议:
local_var ||= "initialized"
'除非'不是范围门,事实上如果你把它写出来(就像在我的回答中那样),这个变量在'end'之后是可用的。另外,如果你做'other_local_var =“初始化”,除非定义? local_var',变量'other_local_var'随后可用!只有当你试图设置未被初始化的变量在一个班轮中被检查。 – mwp
@mwp我同意这行'other_local_var =“初始化”除非定义? '。如果结构具有与块相同的行为,则为联机。因此,例如,当你将上面的代码映射到块结构时:'除非定义? local_var local_var =“已初始化” end'。那么你可以清楚地看到** local_var ** scope/life_cycle只在该块中。在该块之外,不存在已分配的值。 –
@KhAmmad:你错了。在块之后,一个在'if' /'unless'块中初始化的变量仍然存在。看:http://ideone.com/OpWtlQ –
尝试var2 = "Not Empty" if var2.nil?
如果你想弄清楚变量是否是nil
或不是。 defined?
很少用于不同目的(见下文)。
irb(main):009:0> var2 = nil
=> nil
irb(main):010:0> var2 = "Not Empty" if var2.nil?
=> "Not Empty"
irb(main):011:0> var2
=> "Not Empty"
irb(main):012:0> var2 = 'foo'
=> "foo"
irb(main):013:0> var2 = "Not Empty" if var2.nil?
=> nil
irb(main):014:0> var2
=> "foo"
如果你不能确定一个变量是否已经更被宣布,您可以使用以下语法:
if defined?(var2).nil?
var2 = "Not Empty"
end
(它不工作,都在一个因为一些奇怪的原因,正如@Jordan所指出的,但是这个工作起来。)
但是,这种惯用的Ruby方式来做到这一点,一般来说,被称为“零后卫”和如下所示:
var2 ||= "Not Empty"
- 1. 是我的代码未定义行为
- 2. 我的JavaScript代码是不是在Visual Studio代码工作
- 3. 我有一个定义的变量,但是代码说,这是没有定义
- 4. Scrollspy是不是我的代码工作
- 5. 引导CSS是不是我的代码
- 6. UTF8不是我的.NET代码在Excel
- 7. 两行正在删除,而不是一行我的代码
- 8. 链表代码不是非常优雅
- 9. “遗留代码”的定义是什么?
- 10. 我的代码是托管还是非托管?
- 11. ZORDER代码是不是为我工作
- 12. 什么是我的XML的正确自定义配置代码?
- 13. 我的代码是VB6。我正在编译错误:未定义用户定义的类型。我的代码是Dim ctxObject As ObjectContext
- 14. 我在Python代码是不工作
- 15. 删除C++特定节点链表。代码是否有意义?
- 16. 确定什么是错我的代码
- 17. 这段代码是否定义良好?
- 18. 如何确定UIScrollView崩溃是在我的代码还是Apple?
- 19. 从NightmareJS我的HTTP响应代码是未定义
- 20. 硒RC是不开放在我的代码指定网址
- 21. 为什么下面的代码是行不通的,除非数组是整数[],不是int []
- 22. AJAX的readyState是不是在我的代码更改为4
- 23. 我的自定义的UITableViewCell是非常在iOS7
- 24. 我不想重定向一些页面,我的代码是
- 25. 为什么不是我的代码除了错误?
- 26. PHP是不是在我的HTML代码中工作
- 27. JavaScript是不是在我下面的代码
- 28. 功能是不是在我的代码工作
- 29. 第一胎是不是在我的CSS代码工作正常
- 30. Javascript代码是不是在我的Android应用
一个谁已经下来投它,请解释他为什么这样做。 –
那就是我,我不是'他'。在这行代码之前没有上下文知道'var2'是(或不是)。你为什么期望它返回“不空”? – sevenseacat
@ShahrozShaikh描述的行为发生在'var2'之前没有被定义的任何上下文中。如果你将上面的代码本身放在一个Ruby文件中,它就是@ShahrozShaikh所说的那样。看一看,这很令人费解:http://ideone.com/ihm2Pt –