2013-02-06 28 views
1

在PHP中,我可以輕鬆地寫出:Ruby如何處理未聲明的變量而不是php?

if (x > 100) 
{ 
    method(); 
} 

知道,如果X不存在,我的程序會將其視爲在路上小凸點,繼續向前。

我習慣於使用php的超級鬆散變量打字和未聲明的處理,並且想知道Ruby的規則與此有關。

當您嘗試評估未聲明的內容時,Ruby的默認操作是什麼?

如果我可以胡椒這太...在null中,null,零和false等於相同的東西嗎? 會

if(!x) 
{ 
    puts 'works' 
} 

puts?

我知道這些都是非常簡單的問題,但它們對我來說太明顯了,或者我使用了錯誤的搜索短語。

+6

這是一個公平的問題,但爲什麼不嘗試一下? –

+0

我約10分鐘到Ruby。我仍然在學習語法。 – Silvius

+0

1.9。3p194:004> if(x <10){puts'yay'} 1.9.3p194:005?> – Silvius

回答

4
  1. 如果你使用了一個你沒有轉化的變量,Ruby會發出抱怨。

  2. 在Ruby中,你通常不括在{}if,你把一個ifend結束。

  3. falsenil0是不同的東西。您的代碼會抱怨x沒有定義,並且只會puts如果xfalsenil

  4. 在紅寶石來檢查值nil您使用nil?像這樣if !x.nil?

+0

謝謝!你可能爲我節省了一個小時,而且無法估量一堆混亂。 – Silvius

+0

數組索引怎麼樣? 如果我有S [0] = 0,如果(S [1])會導致與未聲明的變量相同的錯誤嗎? – Silvius

+1

「......只會在x爲假的情況下放置」 - 如果x爲零,我敢肯定它會輸出。 – PinnyM

1

從最後一個問題開始:在紅寶石中,零不被視爲錯誤,唯一的錯誤值是:nil,明顯是false。其他一切都是「真實」的價值。

注意:我將使用實例變量,因爲它不是非常正常的,因爲沒有實例化局部變量。

那麼,爲什麼這不會工作

if @x > 100 
    method() 
end 

因爲>在紅寶石其實是一個方法調用,所以如果@x是零(未定義變量),它會提高一個NoMethodError,因爲零沒有定義的方法。

NoMethodError: undefined method `>' for nil:NilClass 

所以,你可以在你的病情做的是首先保證@x具有這樣的值:

if @x && @x > 100 
    method() 
end 
+0

'nil'不是未定義變量的值。未定義的局部變量未定義,嘗試從它們讀取會導致異常。讀取時,未定義的全局和實例變量('$ x'和'@ x'')確實初始化爲'nil'。 –

+0

@LBg哦!謝謝!你是對的 –

+0

實際上局部變量沒有任何意義來檢查它們是否存在。因爲您只能在方法中使用它們,所以您始終可以確保它存在。 –