2012-05-06 36 views
6

我很新的Ruby和Rails,但即使搜索堆棧溢出和谷歌我找不到答案。帶有「已定義?」的三元表達式返回「表達式」而不是值?

我有一個簡單的Ruby速記if語句應該返回一個integer像這樣:

# in the context of this erb document `amount` is defined as 5. 
@c = (defined? amount ? amount : r(1,4)) 

r()是一個自定義的輔助函數,在這種情況下 1和4返回之間的隨機數。

我打算這對工作的方式是,ifamount被定義,則使用限定爲amount數,else產生1和4並使用它之間的隨機數。

打印出@c但是,Ruby輸出expression而不是數字。

我該怎麼做才能按照我的意圖做到這一點,我做錯了什麼?

非常感謝您的閱讀!

回答

8

defined?綁定到amount ? amount : r(1,4)因此它等同於:

defined?(amount ? amount : r(1,4)) 

你可能想:

defined?(amount) ? amount : r(1,4) 

其實,賠率是amount || r(1,4),或amount.nil? ? r(1,4) : amount會更好地匹配你想要什麼,因爲我想你不想要這個:

 
1.9.3p194 :001 > defined?(amount) 
=> nil 
1.9.3p194 :002 > amount = nil 
=> nil 
1.9.3p194 :003 > defined?(amount) 
=> "local-variable" 

...在這種情況下,@c將是nil - 已定義變量的值。

+0

完美,非常感謝!很明顯,我還沒有學到更多的這些基礎知識,但這已經超過了'amount ||'的幫助r(x,y)'完全按照我想要的方式工作,並且同時處於較少的字符中。 – Jannis

2

使用在這種情況下,運營商||

@c = amount || r (1,4) 

在你的代碼中,defined?方法上amount ? amount : r(1,4),而不是隻爲你打算在amount工作。此外,defined?運營商可能不會做你期望的,看看這個blog entry得到一個想法。

+0

謝謝!那篇博文非常有啓發性,現在我明白了'定義'對於真正有用! – Jannis