回答
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. 引導CSS是不是我的代碼
- 2. UTF8不是我的.NET代碼在Excel
- 3. 鏈表代碼不是非常優雅
- 4. 「遺留代碼」的定義是什麼?
- 5. ZORDER代碼是不是爲我工作
- 6. 我的代碼是VB6。我正在編譯錯誤:未定義用戶定義的類型。我的代碼是Dim ctxObject As ObjectContext
- 7. 確定什麼是錯我的代碼
- 8. 硒RC是不開放在我的代碼指定網址
- 9. 如何確定UIScrollView崩潰是在我的代碼還是Apple?
- 10. 從NightmareJS我的HTTP響應代碼是未定義
- 11. 爲什麼我的代碼給'int'對象不是可自定義的錯誤?
- 12. 第一胎是不是在我的CSS代碼工作正常
- 13. 功能是不是在我的代碼工作
- 14. 我簡單的代碼是不工作
- 15. CSS是不符合我的html代碼
- 16. HtmlAgilityPack我的代碼(不是HtmlAgilityPack問題)
- 17. 我的Ajax JavaScript代碼是不工作
- 18. 這c代碼仍然不是一個定義的輸出?
- 19. 自定義的驗證是不是在我的形式工作
- 20. 自定義的Log4j Appender是不是在我的Eclipse插件
- 21. jQuery是不是(在jQuery UI的)定義
- 22. 我的壞MIME:代碼是Obj-C,但問題不是語言特定的 - 非常棘手
- 23. PHP我的查詢是在phpmyadmin工作,但不是在我的代碼
- 24. 代碼不是在MATLAB
- 25. .Autofilter不是在代碼
- 26. 是我的代碼堆棧?
- 27. 代碼含義是什麼?
- 28. JavaScript代碼是不是在PhpStorm
- 29. 它是iCloud還是我的代碼?
- 30. ActiveRecord的柱上添加DISTINCT不是由我的代碼指定
一個誰已經下來投它,請解釋他爲什麼這樣做。 –
那就是我,我不是'他'。在這行代碼之前沒有上下文知道'var2'是(或不是)。你爲什麼期望它返回「不空」? – sevenseacat
@ShahrozShaikh描述的行爲發生在'var2'之前沒有被定義的任何上下文中。如果你將上面的代碼本身放在一個Ruby文件中,它就是@ShahrozShaikh所說的那樣。看一看,這很令人費解:http://ideone.com/ihm2Pt –