2012-01-12 71 views
1

我在學Ruby,我喜歡玩irb來發現新的功能和技巧。今天我玩的是變數和方法,因爲我想知道哪一個在另一個前面偏好。一切似乎都很正常,直到我試圖這樣的:Ruby知道'myvar'是myvar = 0中的一個變量,如果爲false

def test 
    puts "hello" 
end 

test = "bye" if false 

puts test 

我期待這回"hello",但事實並非如此。所以,我想解析器將'test'視爲變量而不是方法。我有兩個問題:

  1. 我的假設是否正確?
  2. 有什麼辦法可以知道是什麼是一個變量還是方法?無論如何創建像test.is_variable?
+1

即使沒有「test =」bye「if false」行,代碼也會返回'hello''nil',因爲'test'方法返回'nil'的puts(「hello」)的結果。 – mbillard 2012-01-12 18:09:28

+0

@GoodEnough你說得對。我也嘗試過,沒有「放入」。感謝評論:) – Nobita 2012-01-12 18:11:27

回答

3
test = "hello" if false 
p test #=> nil 

局部變量test一些方法(使用默認值nil),並考慮到局部變量掩蓋具有相同名稱的方法,這就是你得到的價值。一小時前someone被這個主題的微妙變化所咬。難道你不認爲這只是一個班輪條件語句發生:

if false 
    test = "hello" 
end 
p test #=> nil 

這是因爲Ruby定義變量的時候,他們被解析(而不是當它們被執行)。

+0

局部變量在解析時被定義。沒有什麼比這更多的了。 – 2012-01-14 03:41:08

+0

@Jorg:是的,我會稍微更新一下。 – tokland 2012-01-14 08:59:43

0

至少有兩種方法可以幫助:methodslocal_variables。我不推薦在真實世界的程序中使用它們,但在學習Ruby時它們可能會有用。

+0

我不明白「至少有兩種方法有幫助」是什麼意思? – Nobita 2012-01-12 18:12:11

+0

還有其他的,例如'private_methods','public_methods','global_variables'等,如果你想知道「至少有兩個」。 – 2012-01-12 18:16:00

+0

局部變量是否也考慮了方法?這是我很驚訝。 – Nobita 2012-01-12 18:17:36

相關問題