簡體   English   中英

我不了解ruby的本地范圍

[英]I don't understand ruby local scope

在這個例子中

def foo(x)
  if(x > 5)
    bar = 100
  end
  puts bar
end

然后foo(6)輸出:100和foo(3)什么都不輸出。

但是,如果我將定義更改為

def foo(x)
  if(x > 5)
    bar = 100
  end
  puts bob
end

我收到“未定義的局部變量或方法”錯誤。

所以我的問題是,為什么我在調用foo(3)並沒有設置bar時沒有收到此錯誤?

這里發生了幾件事。 首先,在if塊內聲明的變量與在方法頂層聲明的變量具有相同的局部范圍,這就是為什么barif之外可用的原因。 其次,由於bob被直接引用而突然遇到錯誤。 Ruby解釋器從未見過它,也從未見過它初始化過。 但是,它之前在if語句中看到bar初始化。 因此,當被禁止時,它知道它的存在。 結合這兩個,這就是您的答案。

您的第二個示例實際上是一條紅鯡魚:之所以得到異常,並不是因為bob未初始化,而是因為它是模棱兩可的。 不可能確定它是變量還是方法。

您的第一個示例有效,因為未初始化的局部變量(以及全局變量和實例變量)求值為nil 因此, puts bar非常好:在一種情況下, bar初始化為100 ,其值為100 ,在另一種情況下, bar未初始化,因此值為nil puts調用to_s放在其參數(為nil定義)上(它只是返回空字符串),因此一切都很好。

另請參見在Ruby中,為什么在啟動irb后,foo.nil? 說未定義的錯誤,@ foo.nil? 給出“ true”,@@ wah.nil? 再次給出錯誤?

因此,請勿將其視為福音(因為它更多的是基於觀察然后理解),但是紅寶石解釋器似乎會將等號左側的任何單詞(前面沒有豎線)標記為本地。 您的例子很奇怪,這更奇怪

def foo
  bar = bar
  puts bar // nil, which gets coerced into ""
end

我不知道它為什么或如何工作,但是在那里。

foo(3)不輸出任何內容。 它輸出一個換行符。

使用inspect可以給您更多提示:

def foo(x)
  if(x > 5)
    bar = 100
  end
  puts bar.inspect
end

foo(3)

打印出來

nil

bar是一個完整的變量,恰好具有值nil

我不確定你在問什么。 由於從未定義bob ,因此使用第二個定義運行foo(3)始終會給出錯誤。 該方法的參數不會改變它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM